কোন ফাংশনটির নাম কী যা কোনও যুক্তি গ্রহণ করে না এবং কিছুই দেয় না? [বন্ধ]


80

জাভা 8 এর java.util.functionপ্যাকেজে আমাদের রয়েছে:

  • ফাংশন : একটি যুক্তি নেয়, একটি ফলাফল তৈরি করে।
  • গ্রাহক : একটি যুক্তি নেয়, কিছুই উত্পাদন করে না।
  • সরবরাহকারী : কোন যুক্তি নেই, একটি ফলাফল তৈরি করে।
  • ... : অন্যান্য ক্ষেত্রে আদিম, 2 টি আর্গুমেন্ট, ইত্যাদি পরিচালনা করে ...

তবে আমাকে " কোনও যুক্তি লাগে না, কিছুই উত্পন্ন করে না " কেসটি পরিচালনা করতে হবে need

এই জন্য কিছুই নেই java.util.functionnal

সুতরাং, প্রশ্নটি হ'ল:

' কোন ফাংশন যা কোনও যুক্তি নেয় না এবং কিছুই দেয় না ' এর নাম কী?

জাভা 8 এ, এর সংজ্ঞাটি হবে:

@FunctionalInterface
public interface InsertANameHere {
    void execute();
}

নির্বাহক ইতিমধ্যে বিদ্যমান এবং এর অন্য উদ্দেশ্য রয়েছে: "এমন একটি বস্তু যা জমা দেওয়া চলমান কার্য সম্পাদন করে "। স্বাক্ষরটি মেলে না ( execute(Runnable):void) এবং এটি কার্যকরী ইন্টারফেসও নয়

চলমান বিদ্যমান, তবে এটি থ্রেডিং প্রসঙ্গে দৃ context়ভাবে লিঙ্কযুক্ত:

  • প্যাকেজটি java.lang, না java.util.function
  • জাভাদোক বলেছেন: " রান্নেবল ইন্টারফেসটি এমন কোনও শ্রেণীর দ্বারা প্রয়োগ করা উচিত যার উদাহরণগুলি থ্রেড দ্বারা চালিত করার উদ্দেশ্যে করা হয় "।
  • "চলমান" নামটি থ্রেডের মধ্যে কিছু চলমান কোডের পরামর্শ দেয়।

28
"তবে এর পক্ষে কিছুই নেই" কোনও যুক্তি তোলে না, কিছুই দেয় না "" " - চলমান ?
ব্যবহারকারী 11153

11
আমি মনে করি যে জাভাডোকটি Runnableএই মুহুর্তে পুরানো, কারণ একটি রান্নেবলও অন্যান্য শ্রেণি দ্বারা ব্যবহৃত হয় Thread( Executorউদাহরণস্বরূপ)।
স্পেসট্রুকার

13
@ সুপেরবব Runnableএর অর্থ এই নয় যে গুলি কেবলমাত্র এস .run()দ্বারা হতে পারে Thread। বাস্তবে এগুলি খুব সাধারণভাবে প্রশ্নে বর্ণিত ঠিক উদ্দেশ্যে ব্যবহার করা হয়
ব্লগটি

5
@ সুপেরবব এটি প্রাথমিক উদ্দেশ্য ছিল তবে জাভা 8-এর পর এটি কার্যকরী ইন্টারফেস হিসাবে "পুনঃনির্মাণ" ছিল। সুতরাং আপনি java.util.function প্যাকেজে কিছুই খুঁজে পান নি ।
ব্যবহারকারী 11153

5
সেমি-স্ন্যার্ক: ইম্পিউরফানশন কারণ এটি অবশ্যই কেবলমাত্র পার্শ্বপ্রতিক্রিয়ার উপর নির্ভর করে, অন্যথায় এটি কোনও বিকল্প নেই। ( En.wikipedia.org/wiki/Pure_function#Impure_functions ) আরও অধিক Seriosuly: অনুজ্ঞাসূচক (কিছু), যা অন্তত অকার্যকর শব্দার্থবিদ্যা মেলে দিবে চালানো ();
ক্রিস্টিয়ান এইচ

উত্তর:


71

প্রতিটি আরটির জন্য পৃথক নামের সাথে জাভা'র পছন্দটি করা বোকামি ছিল। এটি হুবহু অনুকরণ করার মতো নয়। তবে, যদি আপনার অবশ্যই ধারাবাহিকতার জন্য, বা আপনি খুব জেনেরিক লাইব্রেরি কোড লিখছেন তবে কনরাদের পরামর্শগুলি ভাল। আমি Procedureরিং মধ্যে নিক্ষেপ করতে পারেন ।

সিউডো-ফাংশনাল দৃষ্টান্ত ব্যবহার করার অর্থ এই নয় যে নামকরণের সাধারণ নীতিগুলি উইন্ডোটির বাইরে চলে যাওয়া উচিত। ইন্টারফেস প্রায় সবসময় তারা যা নামকরণ করা উচিত না , কিছু জেনেরিক অন্বিত ধারণা পরে না। ফাংশন একটি পূর্বাবস্থা স্ট্যাকের মধ্যে স্থাপন করা হয়, তারা নামে করা উচিত UndoFunction। যদি তাদের জিইউআই ইভেন্ট থেকে ডাকা হয় তবে তাদের নাম দেওয়া উচিত GUIEventHandler। বন্ধুরা খারাপ নামকরণের সম্মেলনগুলিকে স্থায়ী করতে দেয় না।


Procedureখুব ভাল। প্রসঙ্গে, আমি একটি জেনেরিক লাইব্রেরি বিকাশ করছি যা এই ধরণের "কাঠামো" পরিচালনা করতে হবে।
সুপারবব

18
Procedureআমার পাস্কাল দিনগুলি থেকে আমি পছন্দ করি । এ Procedureএর পার্শ্ব প্রতিক্রিয়া রয়েছে, একটি Functionহয় না। যেহেতু আপনি কোনও মান ফিরিয়ে দেন না, কেবলমাত্র এটির পার্শ্ব প্রতিক্রিয়া রয়েছে।
স্পেন্সার রথবুন

আমি ব্যবহার আনত হতে পারে ProcedureRIR<T1,T2>জন্য void proc(T1, int, T2)সম্ভবত বরং ধরনের প্রতি সম্ভব একযোগে ঠুসা চেষ্টা করার চেয়ে চাহিদা তাদের অধিকাংশই তৈরি - অন্য ধরনের জন্য, এবং অনুরূপভাবে।
ক্যাট

1
প্রকৃতপক্ষে, বাস্তব কার্যকরী প্রোগ্রামিং সাধারণত হাঙ্গেরিয়ান স্টাইলের নামকরণকে উত্সাহ দেয় না। এটি কার্যকরী না হয়ে oo দৃষ্টান্তের মানসিকতা বেশি।
slebetman

3
If the functions are placed into an undo stack, they should be named UndoFunction.ফাংশনটির নামকরণ এবং এটি আলাদা ধরণের দেওয়ার মধ্যে পার্থক্য রয়েছে। ক্রিয়ামূলক শৈলী যে আপনি একটি তৈরি করবে না UndoFunctonকারণ এখন আপনি এটি প্রেরণ করতে পারবেন না টাইপ flip, curry, compose, filter, map, ইত্যাদি আমার মতে যে আসল কারণ জাভার বিভিন্ন নাম বিভিন্ন arities সঙ্গে ফাংশন দেয়ার সিদ্ধান্ত কতটা বোকা হয়। অবশ্যই, আপনি যদি পার্শ্ব প্রতিক্রিয়া ব্যবহার করতে চলেছেন তবে যা কিছু কল করুন; আপনি ইতিমধ্যে রচনাটি উইন্ডোটির বাইরে ফেলে দিয়েছেন এবং আপনি যুক্তিযুক্তভাবে কোনও ফাংশন ব্যবহার করছেন না।
ডোভাল

33

জাভা জগতে একে বলা হয় Runnable। সি # বিশ্বে এটি বলা হয় Action

তবে, এর চেয়ে আরও ভাল নাম রয়েছে যা জিনিসগুলির বৃহত্তর দৃশ্যের সাথে খুব ভালভাবে ফিট করে।

বিষয়গুলির বৃহত্তর দৃষ্টিভঙ্গিটি পরে আসে, যখন আপনি সিদ্ধান্ত নেন যে আপনার প্যারামিটারলেস শূন্য ফাংশনাল ইন্টারফেসের পাশাপাশি আপনার একই ধরণের ক্রিয়ামূলক ইন্টারফেস থাকতে হবে যা একটি, দুটি, বা আরও বেশি যুক্তি গ্রহণ করে, বা কোনও মান ফেরত দেয়। যখন এটি ঘটে, আপনি চাইবেন যে সমস্ত সত্তার নামগুলি বিচ্ছিন্ন এবং একে অপরের সাথে সংবাদদাতা হোক।

সুতরাং, জাভা, আমি কার্মিক ইন্টারফেসগুলি যে আমি কল আমার নিজের সেট আছে Procedureএস, অনুসরণ হিসাবে সংজ্ঞায়িত:

public interface Procedure
{
    void invoke();
}

public interface Procedure1<T1>
{
    void invoke( T1 argument1 );
}

... (আপনি ছবিটি পেয়ে গেছেন)

এবং আমারও একই ধরণের ইন্টারফেসের সেট রয়েছে Function, এটি একই পদ্ধতিতে সংজ্ঞায়িত হয়েছে, প্রথম জেনেরিক প্যারামিটারটি রিটার্নের ধরণ হিসাবে রয়েছে:

public interface Function<R>
{
    R invoke();
}

public interface Function1<R,T1>
{
    R invoke( T1 argument1 );
}

সুতরাং, এখানে আমার বক্তব্যটি Procedureএটি একটি খুব ভাল নাম কারণ এটি জিনিসগুলির বৃহত দর্শনের মধ্যে সুন্দরভাবে ফিট করে। পরে যদি আপনি সেই পদ্ধতিগুলির সাথে অনুরূপ ক্রিয়ামূলক ইন্টারফেসগুলি রাখার সিদ্ধান্ত নিয়ে থাকেন যা আর্গুমেন্ট গ্রহণ করে বা কোনও মান ফেরত দেয় তবে আপনি এটিতে চলে আসবেন।

দ্রষ্টব্য: আমি মূলতকার্ল বিলেফেল্টের এই বক্তব্যের সাথে একমত যে, "সাধারণ নামকরণের নীতিগুলি উইন্ডোটির বাইরে যাওয়া উচিত নয়" এবং "ইন্টারফেসগুলি প্রায় সবসময় তারা যা করে তার নাম দেওয়া উচিত, কিছু জেনেরিক সিনট্যাকটিক ধারণার পরে নয়।" তবে মনে রাখবেন যে এমনকি তিনি "প্রায় সর্বদা" জন্য অনুমতি দেয়। কখনও কখনও (অপরিহার্যভাবে বেনামে) পদ্ধতি এবং ফাংশনগুলির প্রয়োজন হয়, এবং এটিই ওপি জিজ্ঞাসা করে এবং আমি এটিই উত্তর দিচ্ছি।

সংশোধনী 2017-11-10:

আপনি জিজ্ঞাসা করতে পারেন, Function1<R,T1>পরিবর্তে কেন Function1<T1,R>? এটি যে কোনও উপায়ে যেতে পারে তবে বাম দিকে আমার প্রত্যাবর্তনের মানগুলির জন্য অগ্রাধিকার রয়েছে কারণ আমি 'রূপান্তর-থেকে' (উত্স-টু) -র বিপরীতে 'রূপান্তর-থেকে' (গন্তব্য-থেকে-উত্স) নামকরণ কনভেনশন অনুসরণ করতে পছন্দ করি -ডেসটিনেশন) সম্মেলন। (যা কোনও কনভেনশনের চেয়ে দুর্ঘটনার চেয়ে বেশি প্রকৃতপক্ষে, সম্ভবত এই ধারণাটি কেউই কখনও দেয়নি, কারণ তারা যদি এটিকে কোনও ধারণা দিত তবে তারা 'রূপান্তর-থেকে' সম্মেলনে পৌঁছে যেত would )

আমি জোয়েল স্পলকসিতে এটি সম্পর্কে পড়েছি - ভুল কোড লুক রেকং তৈরি করা , এটি একটি দীর্ঘ দীর্ঘ নিবন্ধ, যা আমি এর সম্পূর্ণরূপে পড়ার পরামর্শ দিই, তবে আপনি যদি সরাসরি মামলায় ঝাঁপিয়ে পড়তে চান তবে 'টাইপফ্র্যামটাইপ' অনুসন্ধান করুন, তবে আপনাকে টিএল প্রদান করবেন; ডিআর, ধারণাটি এটির myint = intFromStr( mystr )চেয়ে অনেক ভাল myint = strToInt( mystr ), কারণ প্রথম ক্ষেত্রে প্রকারের নামগুলি সম্পর্কিত মানগুলির সাথে খুব কাছাকাছি থাকে, তাই আপনি সহজেই দেখতে পারেন যে 'ইন্টার' এর সাথে 'ইন্টার' মিলছে এবং 'str' এর সাথে 'str' মেলে।

সুতরাং, এক্সটেনশনের মাধ্যমে, আমি কোডগুলিতে কোডগুলিতে যেভাবে প্রদর্শিত হবে সেভাবে সেগুলি অর্ডার করতে চাই।


1
এই সমাধানটি সত্যিই ভাল, এটি জাভা এর নিজস্ব সরবরাহকারী, গ্রাহক, বায়ু ফাংশন, ... এর চেয়ে আরও বেশি বুলেটপ্রুফ বলে মনে হচ্ছে, কারণ এটি সবকিছু কেবল দুটি ধারণার মধ্যে রাখে। এটি "কার্ল বিলেফেল্টের উত্তর সম্পর্কে মনে করিয়ে দেয় যে" জাভা প্রতিটি ধর্মাবলম্বীর পৃথক নামের সাথে সেভাবে এটি করার পছন্দ করেছিল [যা] বোকা ছিল "। কেবলমাত্র "ক্ষয়ক্ষতি" হওয়ায় এটি আদিম ধরণের এবং তাদের সংমিশ্রণগুলি পরিচালনা করে না (DoubleToLongFunction, ToLongBiFunction, ... এর মতো মজাদার স্টাফ)। তবে
আদিমগণ

হ্যাঁ. মূলত, একবার আপনি জেনেরিকগুলি আদিমগুলির সাথে প্রতিস্থাপন করা শুরু করার পরে, এর অর্থ হল যে আপনি কার্য সম্পাদন সম্পর্কে সত্যই যত্নবান হন, সুতরাং আপনি যদি এখানে উপস্থাপিত সম্মেলনটি থেকে সরে যান এবং অত্যন্ত স্বনির্ধারিত পারফরম্যান্স উন্নতির জন্য অত্যন্ত স্বনির্ধারিত নাম ব্যবহার করেন তবে তা ঠিক।
মাইক নাকিস

1
যদি আমি ২ য় উত্তর গ্রহণ করতে পারি তবে আমি প্রক্রিয়া এন , ফাংশন এন পরামর্শের জন্য আপনাকে ধন্যবাদটি বেছে নেব । আমি এখনও এটি upvated।
সুপারবব

কেন হয় না Function1<T1, R>?
এরিক

@ এরিক এটি একটি খুব ভাল প্রশ্ন এবং এর উত্তর দেওয়ার জন্য আমি আমার পোস্টটি সংশোধন করেছি।
মাইক নাকিস

18

কেন হবে না Command? প্রদত্ত যে এটি কোনও ডেটা নেয় না এবং কোনও ডেটা ফেরত দেয় না, তবে ধরে নেওয়া যে এটি কল করা কিছুটা প্রভাব ফেলবে (অন্যথায় এটি সত্যিকার অর্থেই অর্থহীন হবে), আমি কল্পনা করি যে এটি প্রায় একটাই কাজ করতে পারে - একটি ক্রিয়াকলাপ চালানো, কিছু ঘটায় make

যার কথা বলতে Actionগেলে। নেট এ জেনেরিক প্রতিনিধিও রয়েছে। জাভা এর বিপরীতে Consumerএটি 0 থেকে 16 টি আর্গুমেন্ট নিতে পারে; অন্য কথায়, এর সর্বাধিকতম সংস্করণ কিছুই নেয় না - দেখুন এমএসডিএন

এবং যেহেতু নামটি বোঝায় না যে "গ্রাস" করার কিছু আছে তাই এটি ভাল নাম পছন্দ হিসাবেও মনে হয়।


1
Commandভাল. এটি কমান্ড প্যাটার্নের সাথে বিভ্রান্ত হতে পারে তবে এটি সমাধান হতে পারে।
সুপারবব

7
আমি পছন্দ করি Actionচেয়ে বেশি Command। কমান্ডটি এমন কিছু মনে হয় যা গ্রহণ এবং মূল্যায়ন করা হয়, যখন তার পার্শ্ব প্রতিক্রিয়াগুলির জন্য একটি ক্রিয়াকলাপ কার্যকর করা হয়।
বার্গি

7
উম্ম ... কীভাবে এটি কমান্ড প্যাটার্ন হতে পারে না ? আপনি ঠিক কমান্ড সত্তা তৈরি করেছেন! এটি এমনকি traditionতিহ্যগতভাবে নামকরণ execute()পদ্ধতি আছে। 0_o '
হাইজিয়ানিয়ান

1
অ্যাকশন সম্পর্কিত পরামর্শ অপছন্দ করুন, কারণ এটি একটি সাধারণ (এবং ভাল) সুইং ইন্টারফেস। কমান্ড যুক্তিসঙ্গত।
ব্যবহারকারী949300

@ user949300 তবে এটি প্রসঙ্গের উপর নির্ভর করে - জাভা হ'ল একটি বিশাল বিশ্ব যা আপনি দেখেন, আমি একজন অ্যান্ড্রয়েড বিকাশকারী (এখন) এবং আমার কাছে জে 2 ইই সম্পর্কিত কোনও আইডিয়োসিঙ্ক্রিজি নেই;) আমি অবশ্যই সম্মত হই, এই নামকরণের কনভেনশনটি সংঘর্ষ হওয়া উচিত নয় আপনার ফ্রেমওয়ার্কটি যার সাথে ব্যবহার করে।
কনরাড মোরাউস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.