سؤال

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

Command<PhoneNumber> makeCall = new Command<PhoneNumber> {
    public void execute(PhoneNumber p) { p.call(); }
}
List<PhoneNumber> phoneList = ...
FunctionalPrimitives.forEach( phoneList, makeCall );

لذا فإن السؤال هو, هل هناك أي شيء من هذا القبيل في الجوافة?

تم تحريره بعد قبول الإجابة للتوضيح

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

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

مثال رمز أكثر اكتمالا ، باستخدام إطار العمل الخاص بي ، قد يكون شيئا من هذا القبيل:

class Stuff {
    private final Stuff CALLS_TO = callsTo(Stuff.class); // a proxy
    public static final Command<Stuff> CMD1 = commandFor(CALLS_TO.someMethod1());
    public static final Command<Stuff> CMD2 = commandFor(CALLS_TO.someMethod2());

    // methods exist for use elsewhere, but are conveniently also wrapped as commands
    public void someMethod1() {...}
    public void someMethod2() {...}
}

class Activity {
    public void handleIt(List<Stuff> stuffs, Command<Stuff> doCmd) {
        doSomeThings();
        ...
        forEach(stuffs, doCmd);
        ...
        doOtherThings();
    }
}
هل كانت مفيدة؟

المحلول

كلا!

قال كيفن بوريليون ، قائد مشروع الجوافة ، عن الميزات الوظيفية للجوافة:

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

ونحن ربما تغيير استراتيجيتنا بشكل كبير عندما يأتي جافا 8 على طول ، ولكن هذا لن يكون لفترة من الوقت حتى الآن.

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

for(PhoneNumber phone : phoneList) {
  phone.call();
}

الطريقة القديمة.من المحتمل أن نكون مقتنعين بجدارة Command, ، لكنني أعتقد أن حالة الاستخدام " لكل " يتم إجراؤها دائما بالطريقة القديمة.

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