JavaRush /مدونة جافا /Random-AR /الأنماط والمفردة - لكل من واجهها لأول مرة

الأنماط والمفردة - لكل من واجهها لأول مرة

نشرت في المجموعة
تستهدف هذه المقالة أولئك الذين واجهوا مفهوم الأنماط لأول مرة، أو سمعوا عنه Singleton، أو ابتكروه بطريقة ما، لكنهم ما زالوا لم يفهموا أي شيء. مرحباً! يواجه طلاب JavaRush أنماطًا لأول مرة في المستوى 15، عندما يطلب الحد الأقصى بشكل غير متوقع "إصلاح" وتنفيذ نمط Singletonباستخدام تطبيق بطيء. لدى الطلاب الذين يسمعون عنه لأول مرة Singletonعلى الفور مجموعة من الأسئلة: ما هو النمط، ولماذا هو مطلوب، وما هو نوع النمط، Singletonوأخيرًا، ما هو نوع التنفيذ البطيء هذا. ولنبدأ بالإجابة بالترتيب: الأنماط والمفردات - لكل من واجهها لأول مرة - 1

ما هو النمط على أي حال؟

من أجل فهم أفضل، أعتقد أنه من المفيد الإجابة على هذا السؤال من التاريخ. من بين المبرمجين هناك أربعة مؤلفين مشهورين: إريك جاما، وريتشارد هيلم، ورالف جونسون، وجون فليسيدس، الذين توصلوا إلى فكرة مثيرة للاهتمام.
الأنماط والمفردات - لكل من واجهها لأول مرة - 2
لقد لاحظوا أنه عند كتابة البرامج، كان عليهم في كثير من الأحيان حل نفس المشكلات تقريبًا وكتابة تعليمات برمجية من نفس النوع في البنية. لذلك، قرروا أن يصفوا في شكل أنماط الأنماط النموذجية التي غالبا ما تستخدم في البرمجة الموجهة للكائنات. نُشر الكتاب عام 1995 تحت عنوان "تقنيات التصميم الموجه للكائنات". أنماط التصميم " . تبين أن عنوان الكتاب طويل جدًا، وأصبح يُعرف ببساطة باسم كتاب عصابة الأربعة . وفي الطبعة الأولى، تم نشر 23 نمطاً، وبعدها تم اكتشاف العشرات من الأنماط الأخرى. لذا، للإجابة على السؤال في هذه الفقرة، "ما هي الأنماط؟" ، دعونا نلخصها في بضع كلمات فقط:
النمط هو حل موحد لمشكلة شائعة.
وهذا Singletonمجرد واحد من هذه الأنماط.

لماذا نحتاج إلى الأنماط (أنماط التصميم)

يمكنك البرمجة دون معرفة الأنماط، ويمكنك التحقق من ذلك ببساطة من خلال إدراك حقيقة أنه بحلول المستوى الخامس عشر في JavaRush كنت قد كتبت مئات البرامج المصغرة دون معرفة أي شيء عن وجودها. يشير هذا إلى أن النمط هو نوع من الأدوات التي يميز وجودها المعلم عن الهواة:
الأنماط والمفردات - لكل من واجهها لأول مرة - 3
تصف الأنماط كيفية حل إحدى المشكلات النموذجية بشكل صحيح. ونتيجة لذلك، فإن معرفة الأنماط توفر عليك الوقت. يمكن إجراء القياس باستخدام الخوارزميات. على سبيل المثال، يمكنك التوصل إلى خوارزمية الفرز الخاصة بك مع لعبة البلاك جاك والأرقام وقضاء الكثير من الوقت عليها، أو يمكنك استخدام تلك التي تم وصفها بالفعل منذ وقت طويل وتنفيذها. إنه نفس الشيء مع الأنماط. بالإضافة إلى ذلك، مع استخدام الأنماط، يصبح الكود أكثر توحيدا، وعند استخدام الأنماط الصحيحة، ستكون أقل عرضة لارتكاب الأخطاء، حيث تم توقعها بالفعل والقضاء عليها في هذا النمط. حسنًا، بالإضافة إلى كل شيء، تتيح معرفة الأنماط للمبرمجين فهم بعضهم البعض بشكل أفضل. إن مجرد ذكر اسم القالب يكفي، بدلاً من محاولة أن تشرح لزملائك المبرمجين ما تريد منهم أن يفعلوه. لذلك، لتلخيص، أنماط التصميم تساعد:
  • لا تعيد اختراع العجلة، بل استخدم الحلول القياسية؛
  • توحيد الكود؛
  • توحيد المصطلحات؛
في ختام هذا القسم، نلاحظ أنه يمكن تبسيط المجموعة الكاملة للأنماط إلى ثلاث مجموعات كبيرة:
الأنماط والمفردات - لكل من واجهها لأول مرة - 4

وأخيرا نمط سينجلتون

Singletonيشير إلى الأنماط التوليدية . ترجمتها الحرفية وحيدة. يضمن هذا النمط أن تحتوي الفئة على كائن واحد فقط (مثيل واحد للفئة) وأن يتم توفير نقطة وصول عامة لهذا الكائن. ويجب أن يتضح من الوصف أنه يجب استخدام هذا النمط في حالتين:
  1. عندما لا ينبغي إنشاء أكثر من كائن واحد من أي فئة في البرنامج الخاص بك. على سبيل المثال، في إحدى ألعاب الكمبيوتر لديك فئة "الشخصية"، ويجب أن تحتوي هذه الفئة على كائن واحد فقط يصف الشخصية نفسها.

  2. عندما تحتاج إلى توفير نقطة وصول عامة لكائن فئة. بمعنى آخر، تحتاج إلى التأكد من استدعاء الكائن من أي مكان في البرنامج. وللأسف، لا يكفي إنشاء متغير عالمي، لأنه غير محمي ضد الكتابة ويمكن لأي شخص تغيير قيمة هذا المتغير وسيتم فقدان نقطة الوصول العالمية إلى الكائن. تكون هذه الخصائص Singletonمطلوبة، على سبيل المثال، عندما يكون لديك كائن من فئة يعمل مع قاعدة بيانات، وتحتاج إلى إمكانية الوصول إلى قاعدة البيانات من أجزاء مختلفة من البرنامج. وسيضمن Singletonعدم وجود رمز آخر يحل محل مثيل الفصل الذي تم إنشاؤه مسبقًا.
يتم حل هاتين المشكلتين من خلال Singleton: يجب أن يكون هناك كائن واحد في البرنامج ويجب أن يكون هناك وصول عالمي إليه. في المثال في المستوى 15، يطلب الحد الأقصى تنفيذ هذا النمط للمهمة التالية (هنا وصفه):
الأنماط والمفردات - لكل من واجهها لأول مرة - 5
وبعد قراءة الشرط بعناية، يصبح من الواضح سبب Singletonالحاجة إلى (Single) بالضبط هنا. بعد كل شيء، يطلب منك البرنامج إنشاء كائن واحد من كل فئة: Sun, Moon, Earth. ومن المنطقي الافتراض أن كل فئة في البرنامج يجب ألا تنشئ أكثر من شمس/قمر/أرض واحدة، وإلا فسيكون الأمر سخيفًا، إلا إذا كنت بالطبع تكتب نسختك الخاصة من Star Wars. ميزة تنفيذ SingletonJava في ثلاث خطوات لا يمكن تنفيذ سلوك Singleton في Java باستخدام مُنشئ عادي لأن المُنشئ يُرجع دائمًا كائنًا جديدًا. لذلك، فإن جميع تطبيقات Singleton"a" تهدف إلى إخفاء المُنشئ وإنشاء طريقة ثابتة عامة تتحكم في وجود كائن واحد و"تدمير" جميع الكائنات التي تظهر حديثًا. إذا Singletonتم استدعاء 'a، فيجب عليه إما إنشاء كائن جديد (إذا لم يكن موجودًا بالفعل في البرنامج) أو إرجاع كائن تم إنشاؤه بالفعل. للقيام بذلك: #1. - تحتاج إلى إضافة حقل ثابت خاص إلى الفصل الذي يحتوي على كائن واحد:
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance; //#1
}
#2. – جعل منشئ الفئة (المنشئ الافتراضي) خاصًا (بحيث يتم إغلاق الوصول إليه خارج الفئة، وبالتالي لن يتمكن من إرجاع كائنات جديدة):
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance;
private LazyInitializedSingleton(){} // #2
}
#3 . - أعلن عن طريقة إنشاء ثابتة سيتم استخدامها للحصول على المفردة:
public class LazyInitializedSingleton {
    private static LazyInitializedSingleton instance;
        private LazyInitializedSingleton(){}
        public static LazyInitializedSingleton getInstance(){ // #3
        if(instance == null){		//if the object has not been created yet
            instance = new LazyInitializedSingleton();	//create a new object
        }
        return instance;		// return the previously created object
    }
}
المثال أعلاه أخرق إلى حد ما، لأننا ببساطة نخفي المُنشئ ونوفر طريقتنا الخاصة بدلاً من المُنشئ القياسي. نظرًا لأن هذه المقالة تهدف إلى تمكين طلاب JavaRush من التواصل مع هذا النمط (والأنماط بشكل عام) لأول مرة، فلن يتم هنا تقديم ميزات تنفيذ المفردات الأكثر تعقيدًا. نلاحظ فقط أنه اعتمادًا على مدى تعقيد البرنامج، قد تكون هناك حاجة إلى تحسين أكثر تفصيلاً لهذا النمط. على سبيل المثال، في بيئة متعددة الخيوط (راجع موضوع المواضيع)، يمكن لعدة سلاسل رسائل مختلفة استدعاء طريقة Singleton's getter في وقت واحد، وسيتوقف الكود الموضح أعلاه عن العمل، لأن كل مؤشر ترابط فردي سيكون قادرًا على إنشاء مثيلات متعددة للفئة ذات مرة. ولذلك، لا تزال هناك عدة طرق مختلفة لإنشاء مفردات صحيحة وآمنة للخيط. ولكن هذه قصة أخرى =) وأخيرا. ما هي التهيئة البطيئة التي طلبها الحد الأقصى ؟تُسمى التهيئة البطيئة أيضًا بالتهيئة البطيئة. هذه هي تقنية برمجة حيث يتم تنفيذ عملية كثيفة الاستخدام للموارد (وإنشاء كائن هو عملية كثيفة الاستخدام للموارد) عند الطلب، وليس مقدمًا. وهو ما يحدث أساسًا في الكود الخاص بنا Singleton"أ". بمعنى آخر، يتم إنشاء كائننا في لحظة الوصول إليه، وليس مقدمًا. لا ينبغي الافتراض أن مفهوم التهيئة البطيئة يرتبط بشكل صارم بـ Singleton"om". تُستخدم التهيئة البطيئة أيضًا في أنماط التصميم التوليدية الأخرى، على سبيل المثال في Proxy وFactory Method، لكن تلك قصة أخرى =) تم استخدام المصادر التالية في إعداد المقالة:
  1. أفضل الممارسات لنمط تصميم Java Singleton مع الأمثلة
  2. أنماط التصميم
  3. تصحيح المفردة في جاوة
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION