2012-03-01 11 views
5

मुझे पता है कि शुद्ध कार्यात्मक प्रोग्रामिंग के लक्ष्यों में से एक उत्परिवर्तन को खत्म करना है, और इसलिए साइड इफेक्ट्स को रोकना है। लेकिन चलिए इसका सामना करते हैं, जावा मौजूद सभी कार्यात्मक-प्रोग्रामिंग पुस्तकालयों के साथ भी एक कार्यात्मक भाषा नहीं है। वास्तव में ऐसा लगता है कि कुछ एफपी पुस्तकालयों को यह पता है और इसकी उम्मीद है। उदाहरण के लिए कार्यात्मक जावा में, Effect कक्षा है। जेडीआई एफपी पुस्तकालय में, Command इंटरफ़ेस है। यह आपको अन्य चीजों के साथ - Iterable के तत्वों के लिए गैर-लूप बॉयलरप्लेट के बिना टाइप-सुरक्षा के साथ कमांड पैटर्न लागू करता है।गुवा में कुछ भी कार्यात्मक जावा के प्रभाव के समान है?

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

तो सवाल यह है कि क्या ऐसा कुछ है जो गुवा में है?

संपादित परिस्थितियों के एक विशिष्ट समूह के तहत, स्पष्टीकरण

मैं एक framework कि "ऊर्ध्वाधर समस्या" सबसे जावा एफपी-पुस्तकालयों में निहित के साथ मदद करता है विकसित कर रहा हूँ के लिए स्वीकार कर जवाब के बाद। तो मैं नहीं वास्तव में ऊपर दिखाए गए कोड उदाहरण बना सकता हूं: यानी, घोषणा के ठीक बाद इसे तुरंत लागू करने के उद्देश्य से, इसके सभी लंबवत-शोर icky-ness के साथ 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(); 
    } 
} 

उत्तर

10

नहीं:

एक और पूरा कोड उदाहरण के लिए, मेरी ढांचे का उपयोग कर, कुछ इस तरह हो सकता है!

केविन Bourrillion, अमरूद परियोजना नेतृत्व, अमरूद के कार्यात्मक सुविधाओं पर कहा है:

"वाक्य रचना बेकार है। साथ ही, यह सामान अब भी रहा है, हमेशा के लिए हमेशा कुछ भी नहीं रहा है और हमेशा एक स्टॉपगैप उपाय नहीं होगा जब तक कि सही भाषा परिवर्तन नहीं आ सकता है, उस समय हम वास्तव में इष्टतम वाक्यविन्यास पर निर्णय ले सकते हैं और कार्यात्मक-शैली प्रोग्रामिंग शुरू कर सकते हैं वास्तव में जावा में एक बार के लिए जीवन बेहतर बनाते हैं। इसलिए मैं निराश हूं कि फ़ंक्शन/पूर्वानुमान सामग्री में कितना प्रयास करना है; यह लाइब्रेरी में अधिक है क्योंकि ऐसा लगता है कि यह एक मुकुट गहना है। "

जावा 8 के साथ आने पर हम शायद हमारी रणनीति को महत्वपूर्ण रूप से बदल देंगे, लेकिन यह नहीं होगा थोड़ी देर के लिए।

इसके अलावा, हमें कई उपयोग के मामले नहीं मिले हैं जिसके लिए हमें लगता है कि Command इंटरफ़ेस जो आप वर्णन करते हैं वह सबसे अच्छा समाधान होगा। उदाहरण के लिए, हम सोचते हैं कि आपका उपरोक्त कोड

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

पुराने तरीके से लिखा गया होगा। हम संभावित रूप से Command की योग्यता से आश्वस्त हो सकते हैं, लेकिन मुझे लगता है कि "प्रत्येक के लिए" उपयोग का मामला पुराने तरीके से हमेशा बेहतर होता है।

+1

आदेशों के लिए "पुराना शैली" तरीका बेहतर क्यों है, लेकिन फिल्टर और परिवर्तनों के लिए बेहतर नहीं है? साथ ही, मुझे पता है कि कार्यात्मक विशेषताओं को जावा 8 तक स्टॉप गैप के रूप में देखा जाता है, लेकिन आपको यह महसूस करना होगा कि जावा 8 कुछ समय बंद है, और इसे अपनाना तत्काल नहीं होगा। अभी भी परियोजनाएं जावा 5 फंस गई हैं (सौभाग्य से, मेरा नहीं)। –

+0

यदि आप [उपयोगकर्ता मार्गदर्शिका] (http://code.google.com/p/guava-libraries/wiki/FunctionalExplained#Caveats) पढ़ते हैं, तो आप देखेंगे कि हम पुराने-पुराने तरीके _is_ फ़िल्टर के लिए बेहतर सोचते हैं और अधिकांश समय में परिवर्तन। हर समय नहीं - यही कारण है कि हम उन विशेषताओं को प्रदान करते हैं - लेकिन अधिकांश समय। –

+0

इसके अतिरिक्त, मूल पोस्ट का कोड उस चीज़ का एक उदाहरण प्रतीत होता है जो [गुवा टीम रोना] बनाता है (http://code.google.com/p/guava-libraries/wiki/FunctionalExplained)। –

संबंधित मुद्दे