تسلسل الأساليب
يُعدّ ربط الدوال صيغة شائعة لاستدعاء عدة دوال في لغات البرمجة كائنية التوجه . تُعيد كل دالة كائنًا، مما يسمح بربط الاستدعاءات معًا في عبارة واحدة دون الحاجة إلى متغيرات لتخزين النتائج الوسيطة.
الأساس المنطقي
تُعتبر تعريفات المتغيرات المحلية بمثابة اختصار برمجي . [ 1 ]
تُغني تقنية تسلسل الدوال عن استخدام متغير إضافي في كل خطوة وسيطة، مما يُريح المطور من عبء تسمية المتغير وتذكره.
يُشار إلى تسلسل الأساليب بأنه يُنتج "كارثة" بسبب الزيادة في عدد الأساليب التي تأتي واحدة تلو الأخرى في نفس الخط والتي تحدث مع زيادة عدد الأساليب المتسلسلة معًا. [ 2 ]
يُشابه هذا التركيبُ تركيبَ التتالي ، حيثُ يُقيَّم التعبير بعد استدعاء الدالة إلى الكائن الحالي، وليس إلى القيمة المُعادة من الدالة. يُمكن تطبيق التتالي باستخدام تسلسل الدوال بجعل الدالة تُعيد الكائن الحالي نفسه . يُعدّ التتالي تقنيةً أساسيةً في الواجهات السلسة ، ولأنّ التسلسل مُطبَّقٌ على نطاق واسع في لغات البرمجة الكائنية بينما التتالي ليس كذلك، يُشار غالبًا إلى هذا الشكل من "التتالي بالتسلسل عن طريق إعادة هذا " ببساطة باسم "التسلسل". كلٌّ من التسلسل والتتالي مُشتقّان من لغة سيمولا .
على الرغم من أن التسلسل هو مجرد بناء جملة، إلا أن له تبعات دلالية، إذ يتطلب من الدوال إرجاع كائن، وإذا تم تطبيق التتالي عبر التسلسل، فيجب أن يكون هذا الكائن هو الكائن الحالي. هذا يمنع استخدام القيمة المُرجعة لأي غرض آخر، مثل إرجاع قيمة خطأ .
أمثلة
تدفقات الإدخال/الإخراج
ومن الأمثلة الشائعة على ذلك std::istreamفئتا std::ostreamدفق الإدخال والإخراج في لغة C++ ، حيث تُرجع الدالة على سبيل المثال <<الكائن الأيسر، مما يسمح بالتسلسل. [ 3 ]
أ << ب << ج ؛// هذا يعادل: a << b ; a << c ;البرمجة الوظيفية
تُعدّ البرمجة الوظيفية مثالاً آخر على استخدام تسلسل الدوال، والذي يتضمن دوالاً من الرتبة العليا. في البرمجة كائنية التوجه ، يمكن تمثيل الدوال من الرتبة العليا ومعالجة المجموعات من خلال دوال متسلسلة. [ 4 ]
أحد الأمثلة على ذلك في لغة جافا يستخدم الطرق المدمجة التالية java.util.stream.Stream<E>:
استيراد java.util.Arrays ؛ استيراد java.util.List ؛ استيراد java.util.streams.Collectors ؛List <Integer> numbers = Arrays.asList ( 10 , 25 , 30 , 45 , 60 , 75 , 90 ) ;List <Integer> result = numbers.stream ( ) // تُرجع الدالة .stream() الدالة java.util.stream.Stream.filter ( n - > n > 30 ) .map ( n - > n * 2 ) .sorted ( ) . collect ( Collectors.toList ( ) ) ;لاحظ أنه في لغة جافا، تُعيد الدوال ` filter()require` و` map()require` و`require` sorted()نسخة سطحية جديدة من القائمة السابقة. ومع ذلك، لإجراء عمليات على القائمة مباشرةً، sort()يمكن استخدام الدالة `require`. [ 5 ]
تستخدم لغة الاستعلام المتكاملة (LINQ) للغة C# بشكل مكثف تسلسل الأساليب. [ 6 ]
باستخدام System ؛ باستخدام System.Collections ؛// باستخدام تسلسل الأساليب : IEnumerble <MyObject> results = SomeCollection.Where ( c = > c.SomeProperty < 10 ) .Select ( c = > new { c.SomeProperty , c.OtherProperty } ) ;النتائج . لكل عنصر ( x => { Console.WriteLine ( x.ToString ( ) ); } ) ;// باستخدام كلمات LINQ الرئيسية : IEnumerable <MyObject> results = from c in SomeCollection where c.SomeProperty < 10 select new { c.SomeProperty , c.OtherProperty } ;foreach ( MyObject result in results ) { Console.WriteLine ( result ) ; }يُقدّم C++20operator| عامل التوجيه (piping operator) ويسمح بعمليات التسلسل على غرار LINQ مع std::rangesمساحات الأسماء. std::viewsيحتوي على عدة فئات يتم استدعاؤها من خلال operator(). [ 7 ]
استيراد std ؛باستخدام std :: vector ؛ باستخدام std :: ranges :: to ؛ باستخدام std :: views :: filter ؛ باستخدام std :: views :: transform ؛vector < int > numbers = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };// مسار المعالجة: تصفية الأعداد الزوجية، ومضاعفتها، ثم جمع متجه النتيجة < int > result = numbers | filter ( []( int n ) -> bool { return n % 2 == 0 ; }) | transform ([]( int n ) -> int { return n * 2 ; }) | to < vector > ();أنماط التصميم
يعتمد نمط البناء على إنشاء كائن من خلال استدعاء الدوال بدلاً من إنشائه مباشرةً في دالة الإنشاء. على سبيل المثال، java.lang.StringBuilderيستخدم نمط البناء تسلسل الدوال لإنشاء كائن java.util.StringBuilder، والذي يُعاد في النهاية إلى كائن من java.util.Stringخلال toString()استدعاء دالة أخرى. [ 8 ]
String result = new StringBuilder () . append ( "Hello, " ) .append ( " world!" ) . insert ( 0 , "Greeting: " ) .replace ( 10 , 18 , "beautiful " ) .toString ( ) ;يعتمد نمط واجهة Fluent بشكل كامل على تسلسل الأساليب لتنفيذ تتالي الأساليب. [ 9 ]
في لغة C++، يمكن تحقيق تسلسل الأساليب المشابه للغتين Java وC# من خلال جعل الأساليب تُرجع قيمة (على سبيل المثال، بالنسبة لفئة StringBuilder، append()يمكن replace()أن يكون للدالة `get` نوعها `value` StringBuilder&وتُرجع قيمة *this). مع ذلك، من المهم في C++ الانتباه إلى احتمالية تجزئة الكائن إذا كانت القيمة المُرجعة تشير إلى فئة أصلية، بينما لا تُعاني لغات أخرى مثل Java وC# و Rust من هذه المشكلة. [ 10 ] [ 11 ]
انظر أيضاً
مراجع
- ↑ "CMSC 631 - تحليل البرامج وفهمها" (ملف PDF) .
• اختصار برمجي للتصريحات المحلية - let x = e1 in e2 هو اختصار لـ (λx.e2) e1
- ↑ مارتن، روبرت سيسيل (2008). الكود النظيف: دليل لحرفية تطوير البرمجيات الرشيقة . برنتيس هول . ISBN 978-0-13-235088-4.
- ↑ "std::basic_ostream" . cppreference.com. 4 سبتمبر 2025.
- ^ ناكامارو، توموكي؛ ماتسوناجا، توموماسا؛ يامازاكي، تيتسورو؛ أكياما، سوراميتشي؛ تشيبا، شيجيرو (2020). دراسة تجريبية لتسلسل الأسلوب في جافا . سيول، جمهورية كوريا: رابطة آلات الحوسبة. ص 93 – 102. دوى : 10.1145 / 3379597.3387441 . رقم ISBN 9781450375177تم الاطلاع عليه بتاريخ 2025-09-04 .
{{cite book}}تم|website=تجاهله ( مساعدة ) - ↑ "Stream (Java SE)" . docs.oracle.com . تم الاطلاع عليه بتاريخ 4 سبتمبر 2025 .
- ↑ "استعلام اللغة المتكامل (LINQ) - C# Microsoft Learn" . learn.microsoft.com . تم الاطلاع عليه في 4 سبتمبر 2025 .
- ↑ "مكتبة النطاقات (منذ C++20) - cppreference.com" . cppreference.com . تم الاطلاع عليه بتاريخ 4 سبتمبر 2025 .
- ↑ "StringBuilder (Java SE)" . docs.oracle.com . تم الاطلاع عليه بتاريخ 4 سبتمبر 2025 .
- ↑ مارتن فاولر ، " واجهة سلسة "، 20 ديسمبر 2005
- ↑ ر.، سوبوراج (2013). البرمجة الكائنية باستخدام لغة C++ وفقًا لمعيار ANSI/ISO . دار نشر فيكاس. ص 260-261. ISBN 978-93-259-6996-4.
- ↑ غرايمز، ريتشارد (24 أبريل 2017). مقدمة في برمجة C++ . برمنغهام: دار نشر باكت المحدودة. ص 309. ISBN 978-1-78712-928-3.
روابط خارجية
- طريقة (برمجة الحاسوب)
