نتائج البحث

اذهب إلى التنقل اذهب إلى البحث

تبديل التابع إلى كائن التابع (Replace Method with Method Object)

المشكلة وجود تابعٍ طويلٍ بالكثير من المتغيِّرات المحليّة (local variables) المتداخلة والتي تحول دون تطبيق تقنية الحل باستخراج التابع (extract method). الحل نقل التابع إلى صنفٍ (class) مستقلٍ بحيث تصبح متغيِّراته المحليّة حقولًا (fields) لهذا الصنف، وتقسيم التابع بعد ذلك إلى عدّة توابع أصغر في الصنف ذاته. مثال قبل إعادة التصميم نلاحظ وجود العديد من المتغيِّرات المحليّة في التابع price()‎ بالإضافة إلى عملياتٍ أخرى قد تكون طويلةً ومعقَّدة: في لغة Java: class Order { //... public double price() ...

دمج التوابع (Inline Methods)

المشكلة أن يكون محتوى التابع (method body) بسيطًا وواضحًا أكثر من التابع بحدِّ ذاته، ويمكن عندئذٍ الاستغناء عنه. الحل نقل الشيفرة الموجودة في التابع (محتوى التابع) إلى مواقع استدعائه، وحذف التابع برمته إذ لا داعي له. مثال قبل إعادة التصميم نلاحظ أن محتوى التابع moreThanFiveLateDeliveries()‎ واضحٌ وبسيطٌ لدرجةٍ تجعل الاستغناء عنه ممكنًا: في لغة Java: class PizzaDelivery { //... int getRating() { return moreThanFiveLateDeliveries() ? 2 : 1; } boolean moreThanFiveLateDeliveries() { ...

استخراج التوابع (Extract Methods)

المشكلة وجود أجزاء من الشيفرة يُمكن عزلها وتجميعها سويةً. الحل نقل الشيفرة إلى تابعٍ (method) أو دالةٍ (function) جديدة والاستعاضة عن الجزء (بمكانه السابق) باستدعاءٍ لهذا التابع الجديد. مثال قبل إعادة التصميم نلاحظ وجود جزء من الشيفرة لطباعة بعض البيانات (التفاصيل)، والتي يمكن عزلها بتابعٍ جديد، الشيفرة قبل إعادة التصميم بالشكل: في لغة Java: void printOwing() { printBanner(); // طباعة التفاصيل System.out.println("name: " + name); System.out.println("amount: " + getOutstanding()); } في لغة #C: void PrintOwing() { PrintBanner(); ...

الصنف Method في روبي

يتم إنشاء كائنات الصنف Method بواسطة التابع Object.method، وترتبط بكائن معين (وليس بالصنف وحسب). ويمكن استخدامها لاستدعاء التابع داخل الكائن، أو ككتلة (block) مرتبطة بمكرر (iterator). كما يمكن فك ارتباطها (unbound) من كائن محدد (سيؤدي ذلك إلى إنشاء الكائن UnboundMethod) ثم ربطها بآخر. class Thing def square(n) n*n end end thing = Thing.new meth = thing.method(:square) meth.call(9) #=> 81 [ 1, 2, 3 ...

تعريف التوابع الدخيلة (Introduce Foreign Methods)

المشكلة الحاجة إلى تابعٍ غير موجودٍ في الصنف المساعد (utility class) ومن غير الممكن إضافته إلى ذلك الصنف. الحل إضافة التابع المطلوب إلى صنف العميل (client class) وتمرير كائنٍ (object) من الصنف المساعد إليه كوسيط (argument). مثال قبل إعادة التصميم يحتوي الصنف Report تابعًا باسم sendReport والذي يستخدم الصنف المساعد Date لإنشاء تاريخ اليوم التالي عبر إضافة القيمة 1 إلى اليوم الحالي، كما يلي: في لغة Java: class Report { //... void sendReport() { Date ...

إنشاء التوابع (Composing Methods)

تستهدف إعادة التصميم بشكل رئيسيٍّ إنشاء التوابع الصحيحة المناسبة، إذ تكون التوابع الطويلة سببًا للمشاكل في كثيرٍ من الحالات، وتجعل شيفرات بعض التوابع منطق التنفيذ (execution logic) غامضًا ويصبح التابع بهذا عصيَّ الفهم من جهةٍ وصعب التغييرٍ من جهة ثانية. يشمل هذا القسم من الحلول كلَّ ما يتعلق بالتوابع وإزالة التكرار (duplicates) في الشيفرة ليسمح بإجراء التطويرات المستقبليّة، وهذه التقنيات هي: استخراج التوابع (Extract Methods) المشكلة: وجود أجزاء من الشيفرة يُمكن عزلها وتجميعها سويةً. الحل: نقل الشيفرة إلى تابعٍ (method) ...

نقل التابع (Move Method)

المشكلة استخدام التابع (method) في صنفٍ (class) ما أكثر من استخدامه في صنفه الأساسيّ. الحل إنشاء تابعٍ جديدٍ في الصنف الأكثر استخدامًا لذلك التابع ونقل شيفرته إلى التابع الجديد، ثم تحويل الشيفرة في التابع الأصليّ إلى مرجعيّةٍ للتابع الجديد في الصنف الآخر أو حذفه كليَّا. مثال قبل إعادة التصميم يستخدِم الصنفُ Class2 التابعَ aMethod()‎ أكثر مما يستخدمه صنفه الأساسيّ Class1: يستخدِم الصنفُ Class2 التابعَ aMethod()‎ أكثر مما يستخدمه صنفه الأساسيّ Class1. بعد إعادة التصميم نُقِل التابع aMethod()‎ إلى الصنف ذي ...

إخفاء التابع (Hide Method)

المشكلة لا يُستخدم التابع من قِبل الأصناف الأخرى أو يستخدم فقط داخل التسلسل الهرمي للصنف الخاص به. الحل جعل التابع خاصًا أو محميًا. مثال قبل إعادة التصميم لا يستخدم التابع ()aMethod من قبل أصناف أخرى غير الصنف Employee المعرف فيه: لا يُستخدم التابع من قِبل الأصناف الأخرى أو يستخدم فقط داخل التسلسل الهرمي للصنف الخاص به. بعد إعادة التصميم جعل التابع ()aMethod خاصًّا ومحميًّا بإخفائه عن الأصناف الأخرى: جعل التابع خاصًا أو محميًا. لم إعادة التصميم؟ في كثير من الأحيان، ...

إنشاء التوابع (Composing Methods)

تستهدف إعادة التصميم بشكل رئيسيٍّ إنشاء التوابع الصحيحة المناسبة، إذ تكون التوابع الطويلة سببًا للمشاكل في كثيرٍ من الحالات، وتجعل شيفرات بعض التوابع منطق التنفيذ (execution logic) غامضًا ويصبح التابع بهذا عصيَّ الفهم من جهةٍ وصعب التغييرٍ من جهة ثانية. يشمل هذا القسم من الحلول كلَّ ما يتعلق بالتوابع وإزالة التكرار (duplicates) في الشيفرة ليسمح بإجراء التطويرات المستقبليّة، وهذه التقنيات هي: استخراج التوابع (Extract Methods) المشكلة: وجود أجزاء من الشيفرة يُمكن عزلها وتجميعها سويةً. الحل: نقل الشيفرة إلى تابعٍ (method) ...

التوابع الطويلة (Long Methods)

توصيف المشكلة تنتُج هذه المشكلة عن احتواء شيفرة التابع على الكثير من الأسطر؛ فهو أمرٌ يدعو للتساؤل حقًا إن كان التابع بأكثر من 10 أسطر! لِمَ؟ أسبابها إنَّ ما يحدث دائمًا أنْ يُضاف للتابع لا أن يُحذَف منه! وذلك لسهولة كتابة الإضافات للشيفرة مقارنةً مع قراءتها، ولن تظهر هذه المشكلة واضحةً إلا بعد تفاقمها ووصولها لحدِ لا يُحتمَل، وكذلك يجد المبرمج أنَّ كتابة تابعٍ جديدٍ أكثرُ مشقّةً من الإضافة لتابعٍ موجودٍ مسبقًا، إذ يفكر: "هما سطران وحسب، ولا داعي لتخصيص ...

الدالة weakref.WeakMethod()‎ في بايثون

صنف فرعي خاصّ من الصنف ref يحاكي إشارة ضعيفة إلى تابع مرتبط bound method (أي تابع معرف في صنف وجرى البحث عنه في نسخة من ذلك الصنف). ملاحظة: هذا الصنف جديد في الإصدار 3.4. البنية العامة class weakref.WeakMethod(method) المعاملات dict التابع المراد إنشاء محاكاة لإشارة ضعيفة إليه. التوابع المرتبطة سريعة الزوال ما يمنع من تمسّك الإشارات الضعيفة العادية بها. يمتلك الصنف WeakMethod طريقة خاصة لإعادة إنشاء التابع المرتبط والإبقاء عليه إلى أن يموت الكائن أو الدالة الأصلية: >>> class C: ... ...

استبدال المعامل بتوابع صريحة (Replace Parameter with Explicit Methods)

المشكلة ينقسم التابع إلى أجزاء، كل منها يتم تشغيله اعتمادًا على قيمة المعامل. الحل استخراج الأجزاء الفردية من التابع إلى توابعها الخاصة واستدعائها بدلًا من استدعاء التابع الأصلي. مثال قبل إعادة التصميم وجود تابع يدعى ()setValue يضبط قيمة الارتفاع والعرض بناءً على تمرير سلسلة نصية صريحة بذلك: في لغة Java: void setValue(String name, int value) { if (name.equals("height")) { height = value; return; } if (name.equals("width")) { width ...

تبديل المعاملات باستدعاءات التوابع (Replace Parameter with Method Call)

المشكلة استدعاء تابع استعلام (query method) وتمرير نتائجه كمعاملات لتابع آخر، في حين أنه يمكن لهذا التابع استدعاء الاستعلام مباشرة. الحل بدلًا من تمرير القيمة من خلال المعامل، حاول وضع استدعاء الاستعلام داخل متن التابع. مثال قبل إعادة التصميم تخزين القيمة التي يعيدها كلٌّ من التابعين ()getSeasonalDiscount و ()getFees في متغير ثم تمريرها إلى التابع ()discountedPrice: في لغة Java: int basePrice = quantity * itemPrice; double seasonDiscount = this.getSeasonalDiscount(); double fees = this.getFees(); double finalPrice = discountedPrice(basePrice, seasonDiscount, fees); في لغة C#‎: int basePrice ...

تحويل التوابع إلى معاملات (Parameterize Method)

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

المعامل ===‎ الخاص بالصنف Method في روبي

يستدعي المعامل === كتلة التابع مع تمرير الكائن الواقع على يمينه كوسيط إلى المعامل الواقع على يساره كما هو الحال في Proc.call. هذا يَسمح لكائنٍ من النوع proc أن يكون هدفًا للكتلة when في التعليمة case. البنية العامة proc === obj→ result_of_proc‎ القيمة المعادة تعاد نتيجة الوسيط proc. انظر أيضا التابع ==: يتحقق من تساوي كائنين من النوع Method. مصادر قسم التابع ===‎ في الصنف Method‎ في توثيق روبي الرسمي.

إعادة تسمية التوابع (Rename Method)

المشكلة لا يعبِّر اسم التابع عن ما يقوم به. الحل إعادة تسمية التابع. مثال قبل إعادة التصميم لا يفسر اسم التابع ()getsnm في الصنف Customer ما يقوم به. لا يفسر اسم التابع ما يقوم به. بعد إعادة التصميم إعادة تسمية التابع ()getsnm إلى ()getSecondName الذي يصف ما يقوم به. يفسر اسم التابع ما يقوم به. لم إعادة التصميم؟ ربما كانت تسمية تابعٍ ما سيئة من البداية - على سبيل المثال، أنشأ شخصٌ ما التابع في عجلة ولم يهتم كفاية بتسميته ...

المعامل ‎[]‎‎ الخاص بالصنف Method في روبي

يستدعي معامل الفهرسة [] الكتلة البرمجية للتابع، ويضبط قيم معاملات الكتلة عند القيم المعطاة ضمنه باستخدام صياغة مشابهة لاستدعاء التوابع ثم يعيد قيمة آخر تعبير تم تقييمه في الكتلة. لاحظ أنَّ ‎prc.()‎ يستدعي prc.call()‎ مع تمرير الوسائط المعطاة. وهي صياغة مختصرة لإخفاء التابع "call". بالنسبة للكائنات procs التي تم إنشاؤها باستخدام lambda أو ‎->()‎‎‎، سيُطلق خطأ إذا كان عدد المعاملات الممررة إلى proc غير صحيح. بالنسبة للكائنات proc التي تم إنشاؤها باستخدام Proc.new أو Kernel.proc، سيتم تجاهل المعاملات الإضافية بصمت، ...

المعامل ==‎ الخاص بالصنف Method في روبي

يتحقق المعامل == من تساوي كائنين من النوع Method. يكون كائنان من النوع Method متساويين إن كانا مرتبطين بنفس الكائن، وكانا لهما نفس التعريف، وكان لهما نفس الصنف أو الوحدة (module) المالكة. البنية العامة meth == other_meth → true or false‎ القيمة المعادة تُعاد القيمة true إن كان الكائنان متساويين، وإلا فستُعاد القيمة false. انظر أيضا التابع ===: يستدعي كتلة التابع مع تمرير الكائن الواقع على يمينه كوسيط إلى المعامل الواقع على يساره كما هو الحال في Proc.call. مصادر قسم ...

التابع bytes.rpartition()‎ في بايثون

يقسم هذا التابع البيانات الثنائية عند آخر ظهور للقيمة التي يحدّدها المستخدم. البنية العامة str.rpartition(sep) المعاملات sep يحدّد هذا المعامل الفاصل الذي سيعتمده التابع في تقسيم البيانات الثنائية. القيمة المعادة يعيد هذا التابع صفًّا مكوّنًا من ثلاثة عناصر، الأول هو جزء السلسلة الذي يسبق الفاصل، والثاني هو الفاصل نفسه أو نسخة عنه من نوع مصفوفة البايتات، والثالث هو الجزء الذي يلي الفاصل. في حال عدم العثور على الفاصل يعيد التابع صفًّا مكوّنًا من ثلاثة عناصر، الأوّل هو نسخة من التسلسل ...

التابع bytes.rpartition()‎ في بايثون

يقسم هذا التابع البيانات الثنائية عند آخر ظهور للقيمة التي يحدّدها المستخدم. البنية العامة str.rpartition(sep) المعاملات sep يحدّد هذا المعامل الفاصل الذي سيعتمده التابع في تقسيم البيانات الثنائية. القيمة المعادة يعيد هذا التابع صفًّا مكوّنًا من ثلاثة عناصر، الأول هو جزء السلسلة الذي يسبق الفاصل، والثاني هو الفاصل نفسه أو نسخة عنه من نوع مصفوفة البايتات، والثالث هو الجزء الذي يلي الفاصل. في حال عدم العثور على الفاصل يعيد التابع صفًّا مكوّنًا من ثلاثة عناصر، الأوّل هو نسخة من التسلسل ...

الدالة staticmethod()‎ في بايثون

تُحوّل الدّالة staticmethod()‎ تابعًا إلى تابعٍ ساكن (static method). البنية العامة staticmethod(fun) @staticmethod المعاملات fun الدّالة أو التّابع المُراد تحويله إلى تابعٍ ساكن. القيمة المعادة يُحوّل التّابع المُزخرَف إلى تابعٍ ساكن لا يستقبل مُعاملًا أولًا صريحًا (المُعامل المعروف بالاسم self في التّوابع). أمثلة المثال التّالي يوضّح كيفيّة إنشاء تابع ساكن باستعمال الدّالة staticmethod كمُزخرِف: >>> class A: ... @staticmethod ... def hello(): # لاحظ أنّ التّابع السّاكن لا يستقبل أيّ مُعامل تلقائيّ كما في التّوابع ...

الوحدة functools‎ في بايثون

تُقدّم الوحدة functools دوال عاليّة الرّتبة (higher-order functions)، وهي دوال تستقبل دوالا أخرى، تُغيّرها، أو تُعيد دوال أخرى. وعلى العموم، يُمكن لأيّ كائن قابل للاستدعاء أن يُعامل مُعاملة الدّالة عند استخدام هذه الوحدة. تُعرّف الوحدة functools الدّوال التّاليّة: functools.cmp_to_key()‎ تُحوّل دالّةَ مُقارنة (comparison function) إلى دالّة مفتاح (key function). functools.partial()‎ تُستعمل لإنشاء دالّة جزئيّة من دالّة بتمرير قيم افتراضيّة ثابتة لها. functools.reduce()‎ تُطبّق دالّةً تأخذ مُعاملين بتراكب لعناصر الكائن القابل للتّكرار المُعطى، من اليسار إلى اليمين لتخفيض العناصر إلى قيمة ...

الدالة super()‎ في بايثون

تعيد الدّالة super()‎ كائنًا وسيطًا يُفوّض استدعاءات التّوابع إلى صنف أبٍ أو صنف شقيق للصّنف الذي استُدعيَت منه الدّالة. هذا مُفيد للوصول إلى التّوابع الموروثة التي أعيدت كتابتها في صنف مُعيّن. ترتيب البحث يكون هو نفسه التّرتيب المُستخدم من طرف الدّالة getattr()‎ لكنّ النّوع type‎ المُعطى يُتجاهَل. البنية العامة super([type[, object-or-type]]) المعاملات type النّوع الذي ستقوم الدّالة super()‎ بتفويض استدعاءات التّوابع إلى صنف أبٍ أو صنف شقيق له. تعرض الخاصيّة __mro__ الخاصّة بالصّنف type ترتيب البحث عن التوابع (method resolution ...

الدالة functools.partialmethod()‎ في بايثون

تعيد الدّالة functools.partialmethod()‎ واصفًا يتصرّف مثل كائنات partial، إلّا أنّه مُصمّم ليُستخدم كتعريف تابع (method definition) عوضًا عن أن يكون قابلا للاستدعاء (callable) مُباشرة. البنية العامة functools.partialmethod(func, *args, **keywords) المعاملات func واصفٌ أو كائن قابل للاستدعاء (تُعامل الكائنات التي تجتمع فيها الصّفتان على أنّها واصفات، مثل الدّوال). عندما يكون func واصفًا (مثل دالّة بايثون عاديّة، أو الدّالة classmethod()‎، أو الدّالة staticmethod()‎، أو نسخة أخرى من partialmethod)، فستُفوّض استدعاءات الخاصيّة ‎__get__‎ إلى الواصف المنشأ، وسيُعاد كائن partial كنتيجة. عندما يكون func ...

التابع ZipFile.writestr()‎‎ في بايثون

يكتب التابع البيانات النصية المعطاة في الأرشيف. البنية العامة ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None) ‎المعاملات ‎zinfo_or_arcname يأخذ هذا المعامل إحدى قيمتين، فإمّا أن يكون اسم الملف في الأرشيف، أو نسخة من الصنف ZipInfo. في حال كانت القيمة المعطاة هي نسخة من الصنف فيجب على الأقل تعيين قيمة للمعاملات filename و date و time على الأقل. أما إن كانت القيمة المعطاة هي اسم الملف، فسيعتمد التابع الوقت والتاريخ الحاليين. يجب أن يكون الأرشيف مفتوحًا في الوضع 'w' أو 'x' أو 'a'. compress_type ...

ازالة توابع الإعدادات (Remove Setting Method)

المشكلة يكون تعيين قيمة الحقل فقط عند إنشائه، ولا تتغير في أي وقت لاحق. الحل إزالة التوابع التي تضبط قيمة الحقل. مثال قبل إعادة التصميم يضبط التابع ()setImmutableValue قيمةً غير قابلة للتغيير أو التعديل في المستقبل: يغيّر التابع من قيمة الحقل. بعد إعادة التصميم حذف التابع ()setImmutableValue من الصنف Customer: إزالة التابع الذي يضبط قيمة الحقل. لم إعادة التصميم؟ إذا كنت تريد منع أي تغييرات في قيمة الحقل. آلية الحل يجب أن تكون قيمة الحقل قابلة للتغيير فقط في الباني. ...

تبسيط استدعاءات التوابع (Simplifying Method Calls)

تجعل التقنيات التي سيشار إليها في هذا القسم استدعاءات التوابع أبسط وأسهل للفهم والاستيعاب. سيؤدي ذلك بدوره إلى تبسيط الواجهات للتفاعل بين الأصناف. هذه التقنيات هي: إعادة تسمية التوابع (Rename Method) المشكلة: لا يعبِّر اسم التابع عن ما يقوم به. الحل: إعادة تسمية التابع. إضافة المعاملات (Add Parameter) المشكلة: لا يملك التابع بيانات كافية لتنفيذ بعض الإجراءات. الحل: إنشاء معامل جديد لتمرير البيانات الضرورية. حذف المعاملات (Remove Parameter) المشكلة: لا يُستخدم معاملٌ ما في متن التابع. الحل: إزالة المعامل غير ...

دفع التابع لأسفل (Push Down Method)

المشكلة هل السلوك المُنفَّذ في الصنف الأب مُستخدمٌ في صنف فرعي واحد فقط (أو أكثر)؟ الحل نقل هذا السلوك إلى الأصناف الفرعية. مثال قبل إعادة التصميم التابع ()getFuel الموجود في الصنف Unit الأب مُستخدم في صنف فرعي واحد فقط الذي هو Tank: التابع الموجود في الصنف الأب مُستخدم في صنف فرعي واحد فقط. بعد إعادة التصميم نقل التابع ()getFuel من الصنف الأب إلى الصنف الفرعي المستخدم فيه: نقل هذا التابع إلى الصنف الفرعي الذي يُستخدم فيه. لم إعادة التصميم؟ في ...

سحب التابع لأعلى (Pull Up Method)

المشكلة تحتوي الأصناف الفرعية على توابع تؤدي نفس العمل. الحل جعل التوابع متطابقة ثم نقلها إلى الصنف الأعلى ذي الصلة. مثال قبل إعادة التصميم يحتوي الصنفان الفرعيان Soldier و Tank على التابع ()getHealth الذي يؤدي نفس العمل: تحتوي الأصناف الفرعية على التابع ()getHealth تؤدي نفس العمل. بعد إعادة التصميم نقل التابع ()getHealth إلى الصنف Unit الأب وإزالته من الأصناف الفرعية: نقل التابع ()getHealth إلى الصنف الأعلى. لم إعادة التصميم؟ تنمو الأصناف الفرعية وتتطور بشكل مستقل عن بعضها البعض، مما يتسبب ...

التابع call‎ الخاص بالصنف Method في روبي

يستدعي call كتلة التابع الذي استٌدعي معه، ويضبط وسائط الكتلة عند القيم المُمرَّرة إليه باستخدام صياغة مشابهة لصياغة استدعاء التوابع ثم يعيد قيمة آخر تعبير تم تقييمه في الكتلة. لاحظ أن ‎prc.()‎ يستدعي prc.call()‎ مع تمرير المعاملات المعطاة. وهي صياغة مختصرة لإخفاء التابع "call". بالنسبة للكائنات procs التي تم إنشاؤها باستخدام lambda أو ‎->()‎‎‎، سيُطلق خطأ إذا كان عدد المعاملات الممررة إلى proc غير صحيح. بالنسبة للكائنات proc التي تم إنشاؤها باستخدام Proc.new أو Kernel.proc ، سيتم تجاهل المعاملات الإضافية ...

الصنف urllib.request.Request‎‎ في بايثون

يعدّ هذا الصنف تجريدًا abstraction لطلب URL. البنية العامة urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) المعاملات ‎url يجب أن يكون سلسلة نصية تحتوي على عنوان URL صالح للاستخدام. data يجب أن يكون كائنًا يحدّد المعلومات الإضافية التي ستُرسل إلى المخدّم، أو يحمل القيمة None في حال انتفاء الحاجة إلى إرسال مثل هذه المعلومات. يستخدم هذا المعامل من قبل طلبات HTTP فقط في الوقت الحاضر. أنواع الكائنات المدعومة هي كائنات bytes، والكائنات الشبيهة بالملفات file-like objects، والكائنات القابلة للتكرار iterables. في ...

الأصناف في بايثون

تعدّ الأصناف وسيلة لجمع البيانات والعمليات في بوتقة واحدة، ويؤدي إنشاء صنف جديد إلى تكوين نوع جديد من الكائنات، ما يتيح إنشاء نسخ (instances) من ذلك النوع. يمكن أن ترتبط بكلّ صنف مجموعة من الخاصيات (attributes) التي تساعد في متابعة حالة الصنف، إضافة إلى مجموعة من التوابع (methods) التي تساعد في تعديل حالة ذلك الصنف. لو أجرينا مقارنة بين بايثون ولغات البرمجة الأخرى، سنجد بأنّ بايثون تضيف قدرًا ضئيلًا من الصياغات الجديدة إلى الأصناف؛ إذ تعتمد بايثون الأساليب المتّبعة في ...

الدالة zlib.compressobj()‎ في بايثون

تعيد الدالة كائن ضغط يمكن استخدامه لضغط البيانات التي لا يمكن وضعها في الذاكرة دفعة واحدة. البنية العامة zlib.compressobj(level=-1, method=DEFLATED, wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=Z_DEFAULT_STRATEGY[, zdict]) ‎المعاملات level المعامل level هو عدد صحيح ضمن النطاق 0 إلى 9 أو ‎-1 ووظيفته هي التحكم في مستوى عملية الضغط، فالقيمة 1 تقابل المستوى(Z_BEST_SPEED) وهو الأسرع ويعطي أقل مقدار من الضغط، والقيمة 9تقابل المستوى(Z_BEST_COMPRESSION) وهو الأبطأ وينتج أكبر مقدار من الضغط. أما القيمة 0 فتقابل المستوى (Z_NO_COMPRESSION) فتعني عدم ضغط البيانات. القيمة الافتراضية لهذا المعامل ...

التابع float.hex()‎ في بايثون

يعيد التابع hex()‎ العدد العشري ذا الفاصلة العائمة كسلسلة نصية تتضمن التمثيل الست عشري لذلك العدد. هذا التابع هو تابع نسخة (instance method). الصيغة العامة x.hex() القيمة المعادة يعيد التابع hex()‎ العدد العشري ذا الفاصلة العائمة كسلسلة نصية تتضمن التمثيل الست عشري لذلك العدد. وتتضمن هذه السلسلة النصية - في حال تطبيق الدالة على عدد عشري محدّد - الرمز 0x في بدايتها والحرف p والأس (exponent) في نهايتها. أمثلة يوضّح المثال التالي القيمة المعادة عند استخدام هذا التابع مع الأعداد ...

تعريف الأصناف في بايثون

أبسط صيغة لتعريف الأصناف في بايثون هي: class ClassName:     <statement-1>     .     .     .     <statement-N> تعريف الأصناف كما هو الحال مع عبارات تعريف الدوال (عبارات def) يجب تنفيذ عبارات تعريف الأصناف حتى يكون لها الأثر المطلوب. يمكن تعريف الأصناف في بايثون ضمن عبارات if أو حتى داخل الدوال. عادة ما تستخدم الدوال داخل تعريف الصنف، ولكن من الممكن استخدام أنواع أخرى من العبارات، وتمتلك الدوال داخل الأصناف مجموعة من الوسائط الخاصّة بعملية استدعاء التوابع في بايثون. ...

تعريف الأصناف في بايثون

أبسط صيغة لتعريف الأصناف في بايثون هي: class ClassName:     <statement-1>     .     .     .     <statement-N> تعريف الأصناف كما هو الحال مع عبارات تعريف الدوال (عبارات def) يجب تنفيذ عبارات تعريف الأصناف حتى يكون لها الأثر المطلوب. يمكن تعريف الأصناف في بايثون ضمن عبارات if أو حتى داخل الدوال. عادة ما تستخدم الدوال داخل تعريف الصنف، ولكن من الممكن استخدام أنواع أخرى من العبارات، وتمتلك الدوال داخل الأصناف مجموعة من الوسائط الخاصّة بعملية استدعاء التوابع في بايثون. ...

Python/linecache/lazycache

التابع linecache.lazycache يحصل هذا التابع على المعلومات الكافية عن وحدة غير معتمدة على الملف" non-file-based" بحيث تكون جاهزة لقراءة أسطرها لاحقًا باستخدام التابع getline حتى لو كان المعامل module_globals غير مُسند ضمن معاملات getline، مما يسمح بتجنب عمليات الكتابة والقراءة إلى حين وجود حاجة حقيقية دون الحاجة إلى الاحتفاظ بالمعامل module_globals ضمن الشيفرة البرمجية. البنية العامة linecache.lazycache(filename, module_globals) المعاملات المعامل filename اسم الملف المُراد وضعه بالكاش بطريقة كسولة. المعامل module_globals قاموس (dict) يحتوي على مفتاحين __name__ و __loader__ يُستخدمان ضمن ...

الدالة classmethod()‎ في بايثون

الدّالة classmethod()‎ مُزخرفٌ يُحوّل تابعًا عاديًّا في صنف ما إلى تابع صنف (class method) ليُمكن الوصول إلى الصّنف الذي عُرّف فيه التّابع. يستقبل تابع الصّنفِ الصّنفَ كمُعاملٍ أول، تمامًا كما يستقبل التّابع العاديّ النّسخة (instance) كمُعامل أولٍ (أي الكائن الذي نُشير إليه عادةً بالاسم self). البنية العامة class C: @classmethod def f(cls, arg1, arg2, ...): ... المعاملات لا توجد مُعاملات. لكنّ الدّالة المُزخرَفَة f تستقبل المُعامل cls الذي يُشير إلى الصّنف الذي عُرّف عليه ...

التابع str.partition()‎ في بايثون

يقسم هذا التابع السلسلة النصية عند أول ظهور للقيمة التي يحدّدها المستخدم. البنية العامة x.partition() المعاملات sep يحدّد هذا المعامل الفاصل الذي سيعتمده التابع في تقسيم السلسلة النصية. القيمة المعادة يعيد هذا التابع صفًّا مكوّنًا من ثلاثة عناصر، الأول هو جزء السلسلة الذي يسبق الفاصل، والثاني هو الفاصل نفسه، والثالث هو الجزء الذي يلي الفاصل. في حال عدم العثور على الفاصل تعيد الدالة صفًّا مكوّنًا من ثلاثة عناصر، الأوّل هو السلسلة النصية نفسها، يليها سلسلتان فارغتان. أمثلة يبين المثال التالي ...

التابع str.rpartition()‎ في بايثون

يقسم هذا التابع السلسلة النصية عند آخر ظهور للقيمة التي يحدّدها المستخدم. البنية العامة x.rpartition() المعاملات sep يحدّد هذا المعامل الفاصل الذي سيعتمده التابع في تقسيم السلسلة النصية. القيمة المعادة يعيد هذا التابع صفًّا مكوّنًا من ثلاثة عناصر، الأول هو جزء السلسلة الذي يسبق الفاصل، والثاني هو الفاصل نفسه، والثالث هو الجزء الذي يلي الفاصل. في حال عدم العثور على الفاصل تعيد الدالة صفًّا مكوّنًا من ثلاثة عناصر، الأوّل هو السلسلة النصية نفسها، يليها سلسلتان فارغتان. أمثلة يبين المثال التالي ...

التابع float.fromhex()‎ في بايثون

هذا التابع هو تابع صنف (Class method) يعيد العدد العشري الذي يمكن تمثيله باستخدام السلسلة النصية التي تتضمن الصيغة الست عشرية. البنية العامة x.fromhex() المعاملات s وهو عبارة عن سلسلة نصية تتضمن القيمة الست عشرية المراد تمثيلها بصيغة العدد العشري، وتأخذ القيمة الست عشرية الصيغة التالية: [sign] ['0x'] integer ['.' fraction] ['p' exponent] الإشارة sign هنا اختيارية وتأخذ القيمتين + أو -، أما العدد الصحيح integer والكسر fraction فهما سلسلتان نصيتان تضمّان أعدادًا بالصيغة الست عشرية، والأس هو عدد عشري يمكن ...

الدالة functools.partial()‎ في بايثون

تعيد الدّالة functools.partial()‎ كائن partial يتصرّف كالدّالة المُعطاة عند استدعائها بما مُرّر من مُعاملات (arguments) ومُعاملات كلمات مفتاحيّة (keyword arguments، أي المُعاملات التي تُمرّر مع ذكر أسمائها إضافةً إلى قيمها). إن استُدعيَ الكائن بمُعاملات إضافيّة، فستُضاف إلى مُعاملات الدّالة، و إن استُدعيَ الكائن بمُعاملات كلمات مفتاحيّة إضافيّة، فستُوسّع وتُعوّض معاملات الكلمات المفتاحيّة السّابقة. تُستعمل لإنشاء دالّة جزئيّة من دالّة بتمرير قيم افتراضيّة ثابتة لها. البنية العامة functools.partial(func, *args, **keywords) المعاملات func الدّالة المرغوب إنشاء دالّة جزئيّة منها. args المُعاملات التي ...

الأعداد العشرية (ذات الفاصلة العائمة) float في بايثون

الأعداد العشرية (ذات الفاصلة العائمة floating point) هي الأعداد التي تتضمن فاصلة عشرية أو علامة أسية: >>> x = 2.5 >>> y = -1.609 >>> z = 3e4 >>> print(z) 30000.0 >>> a = 10. >>> b = .001 >>> c = 0e0 >>> print(a, b, c) 10.0 0.001 0.0 يمكن الحصول على معلومات حول دقّة الأعداد العشرية والتمثيل الداخلي لها في الحاسوب الذي يعمل عليه البرنامج عن طريق مكتبة sys.float_info: >>> import sys >>> sys.float_info sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1) التحويل إلى الأعداد العشرية ...

الأعداد العشرية (ذات الفاصلة العائمة) float في بايثون

الأعداد العشرية (ذات الفاصلة العائمة floating point) هي الأعداد التي تتضمن فاصلة عشرية أو علامة أسية: >>> x = 2.5 >>> y = -1.609 >>> z = 3e4 >>> print(z) 30000.0 >>> a = 10. >>> b = .001 >>> c = 0e0 >>> print(a, b, c) 10.0 0.001 0.0 يمكن الحصول على معلومات حول دقّة الأعداد العشرية والتمثيل الداخلي لها في الحاسوب الذي يعمل عليه البرنامج عن طريق مكتبة sys.float_info: >>> import sys >>> sys.float_info sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1) التحويل إلى الأعداد العشرية ...

تبديل المتغير المؤقت إلى استدعاء(Replace Temp with Query)

المشكلة تخزين نتيجة تعبيرٍ ما (expression) في متغيِّر محليٍّ (local variable) لاستخدامه لاحقًا في الشيفرة. الحل نقل التعبير بأكمله إلى تابعٍ (method) مستقلٍ يعيد نتيجته، وعندها سيكون استدعاء هذا التابع بديلًا عن استخدام المتغيِّر (variable)، ومن الممكن أيضًا دمج هذا التابع مع توابع أخرى عند الحاجة للقيام بذلك. مثال قبل إعادة التصميم نلاحظ في الشيفرة الآتية وجود متغيِّرٍ مؤقتٍ باسم basePrice لتخزين القيمة الناتجة عن تنفيذ التعبير الرياضيّ بمعامل الجداء (أي المعامل *)، وسيُستخدَم هذا المتغيِّر لاحقًا في الأجزاء الشرطيّة ...

الدالة functools.total_ordering()‎ في بايثون

يقوم مُزخرف الأصناف functools.total_ordering()‎ بزخرفة صنف يُعرّف تابعًا أو عدّة توابع ترتيب مُقارنة غنيّة (rich comparison ordering methods)، ويقوم بإضافة بقيّة توابع المُقارنة. يُبسّط هذا الجهد المبذول في تحديد جميع عمليّات المُقارنة الغنيّة المُمكنة. يجب على الصّنف أن يُعرّف التّابع الخاصّ ‎__lt__()‎، أو ‎__le__()‎، أو ‎__gt__()‎، أو ‎__ge__()‎. إضافة إلى التّابع الخاصّ ‎__eq__()‎. البنية العامة @functools.total_ordering المعاملات لا توجد مُعاملات. أمثلة المثال التّالي يوضّح كيفيّة استعمال المُزخرف للمُقارنة بين سياراتٍ حسب سُرعتها، تابع حالة التّساوي يُشير إلى أنّ نُسخةً من ...

الوحدة copy في بايثون

لا تنشئ عبارات الإسناد في بايثون نسخة من الكائنات، بل تربط بين الهدف والكائن. ولكن تظهر الحاجة إلى إنشاء نسخ من الكائنات في المجموعات التي تكون قابلة للتعديل أو التي تتضمّن عناصر قابلة للتعديل، بحيث يكون بالإمكان تغيير نسخة دون انتقال تلك التغييرات إلى الكائن الآخر. دوال الوحدة copy تقدّم هذه الوحدة مجموعة من عمليات النسخ السطحية والعميقة. copy.copy(x)‎ تعيد الدالة نسخة سطحية من الكائن المعطى. copy.deepcopy(x)‎ تعيد الدالة نسخة عميقة من الكائن المعطى. exception copy.error يُطلق هذا الاستثناء عند ...

استبدال المُنشئ بتابع التصميم (Replace Constructor with Factory Method)

المشكلة لديك مُنشئ (constructor) معقد يقوم بما هو أكثر من مجرد وضع قيم المعامل في حقول الكائن. الحل إنشاء تابع تصميم واستخدامه لاستبدال استدعاءات المُنشئ. مثال قبل إعادة التصميم وجود منشئ معقد للصنف Employee: في لغة Java: class Employee { Employee(int type) { this.type = type; } //... } في لغة C#‎: public class Employee { public Employee(int type) { this.type = type; } //... } في لغة PHP: class ...

توحيد التعبير الشرطي (Consolidate Conditional Expression)

المشكلة وجود عدة شروط تؤدي إلى نفس النتيجة أو الإجراء. الحل توحيد جميع هذه الشروط في تعبير وحيد. مثال قبل إعادة التصميم وجود عدة شروط يتم التحقق منها في الشيفرة: في لغة Java: double disabilityAmount() { if (seniority < 2) { return 0; } if (monthsDisabled > 12) { return 0; } if (isPartTime) { return 0; } // حساب مقدار العجز //... } في ...

الحفاظ على الكائن كاملًا (Preserve Whole Object)

المشكلة جلب عدة قيم من أحد الكائنات، ثم تمريرها كمعاملات إلى أحد التوابع. الحل حاول تمرير الكائن بالكامل بدلًا من ذلك. مثال قبل إعادة التصميم جلب قيمة درجة الحرارة المنخفضة low والمرتفعة high من الكائن daysTempRange ثم تمريرهما إلى التابع ()withinTange: في لغة Java: int low = daysTempRange.getLow(); int high = daysTempRange.getHigh(); boolean withinPlan = plan.withinRange(low, high); في لغة C#‎: int low = daysTempRange.GetLow(); int high = daysTempRange.GetHigh(); bool withinPlan = plan.WithinRange(low, high); في لغة PHP: $low = $daysTempRange->getLow(); $high = $daysTempRange->getHigh(); $withinPlan = $plan->withinRange($low, $high); في لغة Python: ...

عرض (50 السابقة | 50 التالية) (20 | 50 | 100 | 250 | 500).