سؤال

أجد أنني أكتب الكثير من التعليمات البرمجية داخل فصولي للحفاظ على خصائص متزامنة مع بعضها البعض. لقد قرأت عن الأحداث في الفصول الدراسية ، لكنني لم أتمكن من لف رأسي حول كيفية جعلها تعمل من أجل ما أبحث عنه. يمكنني استخدام بعض النصائح هنا.

على سبيل المثال ، في هذا واحد أريد دائمًا الاحتفاظ به myColor حتى الآن مع أي تغيير على الإطلاق في أي أو كل Red, Green أو Blue الخصائص.

Class myColors
    Private Property Red As Byte
    Private Property Green As Byte
    Private Property Blue As Byte
    Private Property myColor As Color
    Sub New()
        myColor = Color.FromArgb(0, 0, 0)
    End Sub
    Sub ChangeRed(ByVal r As Byte)
        Red = r
        myColor = Color.FromArgb(Red, Green, Blue)
    End Sub
    Sub ChangeBlue(ByVal b As Byte)
        Blue = b
        myColor = Color.FromArgb(Red, Green, Blue)
    End Sub
End Class

إذا كان واحد أو أكثر من هذه التغييرات ، أريد myColor ليتم تحديثه. من السهل بما يكفي أعلاه ، ولكن هل هناك طريقة للعمل مع الأحداث التي من شأنها أن تفعل ذلك تلقائيًا حتى لا أضطر إلى وضعها myColor = Color.FromArgb(Red, Green, Blue) في كل روتين فرعي؟

هل كانت مفيدة؟

المحلول

في حالاتك ليست مفيدة.

تُستخدم الأحداث كوسيلة لتصرف رمز الآخرين على الكود الخاص بك. يمكنك إجراء حدث حتى تتمكن من إخبار العالم عن شيء يفعله رمزك. يمكنك إجراء حدث لتغيير اللون الذي يمكن أن ترفعه في كل مرة يتم فيها تغيير اللون في مكان ما ، ولكن هذا لن يكون لصالحك وسيتم استخدامه ببساطة من قبل أي جزء آخر من التعليمات البرمجية التي تستخدم فصلك وتريد القيام بشيء ما عندما يتم تغيير اللون.

الأحداث مخصصة للرمز الخارجي ، وليس لإدارة الفئة الداخلية. كما قال الشخص الذي أمامي ، فإن المشكلة التي تواجهها هي مشكلة في التغليف ، يمكنك حل طريقتين:

1) تحديث المتغير الداخلي في كل مرة يتم فيها تغيير شيء ما كما تفعل. لكنني أقترح وضع وظيفة خاصة داخلية تسمى ColorChanged () من شأنها إعادة حساب اللون كما تفعل. أقول اصنع وظيفة لأنه في وقت لاحق على الطريق إذا كنت تريد المزيد من المنطق عند تغيير اللون ، فلن تقلق بشأن تغييره في 3 أماكن.

2) تحديث عندما يكون اللون عندما يتم إعادة صياغته (مثل الشخص الذي أمامي). قم بعمل خاصية تحسب اللون في كل مرة يتم فيها الوصول إليها. هذا هو أبسط وفي معظم الحالات يعمل بشكل مثالي. ولكن إذا كنت تستخدم هذه الخاصية كثيرًا ، فقد تكون جميع هذه إعادة التثبيت مشكلة في الأداء (في هذه الحالة حساب اللون ليس مكثفًا للغاية لذلك لا يهم).

في هذه الحالة ، سأفعل الخيار 2 من أجل البساطة على الرغم من عيب الأداء الصغير ... وأعني عيب الأداء الصغير ...

نصائح أخرى

في هذا السيناريو ، لماذا لا تغير خاصية MyColor الخاصة بك لتكون هذا:

Private ReadOnly Property myColor As Color
  Begin Get
    Return Color.FromArgb(Red, Green, Blue)
  End Get
End Property

بهذه الطريقة ستكون دائمًا متزامنة.

كنت أتخلص من متغيرات الفصل للأحمر والأخضر والأزرق ، وببساطة مع التعامل مع كائن الألوان جميع القيم. يمكنك الاتصال بـ mycolor.r أو .g أو .b للحصول على المكون الذي تريده إذا كنت تريد قراءة القيم لاحقًا. يخزن الكائن mycolor بالفعل R و G و B ، لذلك لا جدوى من تكرار المعلومات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top