كتاب "كيف تعمل جافا سكريبت"

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

يبدأ المؤلف بالأساسيات: الأسماء والأرقام والقيم المنطقية والشخصيات والمعلومات الأساسية الأخرى. سوف تتعرف ليس فقط على مشاكل وصعوبات العمل مع الأنواع في JavaScript ، ولكن أيضًا كيفية التعرف عليها. ستبدأ بعد ذلك في التعرف على بنيات ووظائف البيانات لفهم الآليات الأساسية ، ومعرفة كيفية استخدام وظائف الترتيب العالي ونمط البرمجة الموجهة للكائنات دون فئات.

مقتطفات
كيف يعمل الرمز بدون فصول


وتعتقد أنك ذكي خارج كل الطبقات ومجاني.
جون لينون

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

فائدة إضافية واحدة هي تعدد الأشكال. كل كائن يتعرف على رسالة معينة له الحق في استلامها. ما يحدث بعد ذلك يعتمد على تخصص الكائن. وهذه فكرة مثمرة للغاية.

لسوء الحظ ، بدأنا في صرف الانتباه عن الميراث - وهو مخطط فعال للغاية لإعادة استخدام الشفرة. ترتبط أهميته بالقدرة على تقليل تكاليف العمالة عند تطوير البرنامج. الميراث مبني على خطة مماثلة ، باستثناء بعض الفروق الدقيقة. يمكننا القول أن بعض الكائنات أو فئة الكائنات يشبه بعض الكائنات أو فئة الكائنات الأخرى ، لكن لديها بعض الاختلافات المهمة. في وضع بسيط ، كل شيء يعمل بشكل رائع. تجدر الإشارة إلى أن OOP الحديثة بدأت مع Smalltalk ، وهي لغة برمجة للأطفال. عندما يصبح الوضع أكثر تعقيدًا ، يصبح الميراث مشكلة. أنه يؤدي إلى تماسك قوي من الطبقات. قد يتسبب تغيير فئة واحدة في فشل تلك الفئات التي تعتمد عليها. وحدات من الطبقات هي فقط عديمة الفائدة.

بالإضافة إلى ذلك ، نلاحظ زيادة الاهتمام بالخصائص وليس للأشياء. يتم إيلاء اهتمام خاص لطرق الحصول على (get-methods) وتعيين (set-methods) القيم لكل خاصية فردية ، وحتى في المشروعات الأقل نجاحًا ، تكون الخصائص مفتوحة ويمكن تغييرها دون معرفة الكائن. من الممكن تمامًا تقديم مشروع أكثر نجاحًا ، حيث يتم إخفاء العقارات ، وتعالج الطرق المعاملات ، وليس فقط التعامل مع تغييرات الممتلكات. ولكن هذا النهج لا يتم تطبيقه في كثير من الأحيان.

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

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

الأنواع ليست مسؤولة عن ظهور أخطاء يصعب اكتشافها ومكلفة. خطأهم ليس في حدوث المشاكل الناجمة عن مثل هذه الأخطاء والتي تتطلب بعض الحيل. يمكن أن تدفعنا الأنواع إلى استخدام أساليب البرمجة الغامضة والمربكة والمريبة.

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

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

مصمم


في الفصل 13 ، عملنا مع المصانع - وظائف ترجع الوظائف. الآن يمكننا أن نفعل شيئًا مشابهًا للمنشئين - وظائف تُرجع كائنات تحتوي على وظائف.

لنبدأ بإنشاء عداد مضاد ، على غرار مولد العداد. لديه طريقتين ، صعودا وهبوطا:

function counter_constructor() { let counter = 0; function up() { counter += 1; return counter; } function down() { counter -= 1; return counter; } return Object.freeze({ up, down }); } 

يتم إرجاع الكائن الذي تم إرجاعه. لا يمكن أن يكون معطوباً أو تالفاً. الكائن له حالة. العداد المتغير هو خاصية خاصة للكائن. يمكنك الوصول إليه فقط من خلال الطرق. ونحن لسنا بحاجة لاستخدام هذا.

هذا هو ظرف مهم جدا. واجهة الكائن هي أساليب حصرا. لديه قذيفة قوية جدا. نحصل على أفضل التغليف. لا يوجد الوصول المباشر إلى البيانات. هذا هو تصميم وحدات عالية الجودة للغاية.

المُنشئ هو دالة تُرجع كائنًا. المعلمات ومتغيرات المنشئ تصبح خصائص خاصة للكائن. ليس له خصائص عامة تتكون من البيانات. الوظائف الداخلية تصبح أساليب الكائن. أنها تحول الخصائص إلى تلك مغلقة. الأساليب التي تقع في كائن المجمدة مفتوحة.

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

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

اتضح أن لدينا نوعين من الكائنات.

  • الأجسام الصلبة تحتوي على طرق فقط. تحمي هذه الكائنات سلامة البيانات الموجودة في الإغلاق. أنها توفر لنا تعدد الأشكال والتغليف.
  • تحتوي كائنات البيانات المرنة على بيانات فقط. ليس لديهم سلوك. هذه مجرد مجموعة مفيدة يمكن أن تعمل معها الوظائف.

ويعتقد أن OOP بدأت بإضافة إجراءات إلى السجلات في لغة كوبول ، وبالتالي ضمان نوع من السلوك. أعتقد أن الجمع بين أساليب البيانات والخصائص كان خطوة مهمة إلى الأمام ، ولكن لا ينبغي أن يكون الخطوة الأخيرة.

إذا كان يجب تحويل الكائن الثابت إلى سلسلة ، فيجب تمكين أسلوب toJSON. وإلا ، فسيشاهده JSON.stringify ككائن فارغ ، متجاهلاً الأساليب والبيانات المخفية (انظر الفصل 22).

خيارات البناء


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

إذا كنت حكيماً ، فسوف يكون لدي مُنشئ يأخذ كائنًا واحدًا كمعلمة. يؤخذ عادة من كائن حرفي ، لكن يمكن أن يأتي من مصادر أخرى ، على سبيل المثال ، من محتوى JSON.

هذا من شأنه أن يوفر العديد من الفوائد.

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

في معظم الأحيان ، يتم استخدام المعلمة لتهيئة خاصية خاصة. ويتم ذلك على النحو التالي:

 function my_little_constructor(spec) { let { name, mana_cost, colors, type, supertypes, types, subtypes, text, flavor, power, toughness, loyalty, timeshifted, hand, life } = spec; 

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

تركيب


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

 function my_little_constructor(spec) { let {} = spec; const _ = other_constructor(spec); const  = function () { //   spec, , _,  }; return Object.freeze({ , _. }); } 

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

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

حجم


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

يمكن تقليل الفرق من خلال تحسين نمطية. يتيح لك التركيز على المعاملات ، وليس الخصائص ، تقليل عدد الطرق ، وفي الوقت نفسه تحسين الاتصال.

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

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

»يمكن الاطلاع على مزيد من المعلومات حول الكتاب على موقع الناشر
» المحتويات
» مقتطفات

خصم 25 ٪ على كوبون الباعة المتجولين - جافا سكريبت

عند دفع النسخة الورقية من الكتاب ، يتم إرسال كتاب إلكتروني عبر البريد الإلكتروني.

Source: https://habr.com/ru/post/ar455698/


All Articles