খাঁটি ফাংশনগুলি জন-পাবলিক করার কোনও ভাল কারণ আছে?


25

সহকর্মীর সাথে আমার একটু বিতর্ক হয়েছিল। সহজ কথায় বলতে গেলে, খাঁটি ফাংশনগুলি আড়াল / এনক্যাপসুলেট করার কোনও ভাল কারণ আছে?

"খাঁটি" দ্বারা আমি উইকিপিডিয়া সংজ্ঞা বলতে চাই :

  • সর্বদা একই ইনপুট থেকে একই ফলাফল ফেরত দেয়। (এই আলোচনার খাতিরে Foo Create(){ return new Foo(); }যদি Fooশব্দমূল্যের মূল্য না থাকে তবে তা অশুচি বলে বিবেচিত হয়))
  • পরিবর্তনীয় অবস্থা (স্থানীয় পরিবর্তনশীল ব্যতীত) বা আই / ও ব্যবহার করে না।
  • পার্শ্ব প্রতিক্রিয়া উত্পাদন করে না।

26
কোনও শ্রেণীর এমন ফাংশন সদস্যকে না তৈরি করার পক্ষে যুক্তি থাকতে পারে।
পিটার বি

6
@ পিটারবি - সত্যই, যদিও সমস্ত ভাষা এটি সমর্থন করে না এবং কিছু ভাষাগুলি মডিউলটিকে অভ্যন্তরীণ এমনকি নিখরচায় অনুমতি দেয়।
টেলাস্টিন

3
আপনার মতামত কি ছিল? আমি মনে করি না যে ফাংশনটির বিশুদ্ধতা জনসাধারণের API এ অন্তর্ভুক্ত কিনা এর সাথে সম্পর্কিত।
আন্দ্রেস এফ।

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

2
@ টেলাস্টিন যদি এটি পুনরায় ব্যবহারযোগ্য তবে বর্তমান শ্রেণীর দায়বদ্ধতার অংশ না হয় তবে এটি সম্ভবত একটি পৃথক শ্রেণিতে / মডিউল / আপনার ভাষা-যা-কিছু থাকতে হবে। তারপরে নতুন শ্রেণি / মডিউলটির দায়িত্বের অংশ হওয়ায় এটি অগত্যা সর্বজনীন করা হবে। যেহেতু আপনি পরীক্ষার কথা উল্লেখ করেছেন, আমি নোট করব যে আপনি যখন এটি করবেন তখন আপনাকে অগত্যা পদ্ধতিটি উপহাস করতে হবে না। "বাস্তবায়নের বিশদ হিসাবে," পরীক্ষাগুলির সময় এটি উপহাস করা সামান্য সুবিধা দেয়।
jpmc26

উত্তর:


76

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


33
+1 টি। আপনার শ্রেণীর সর্বজনীন সদস্যরা এর এপিআই। এটি "এটি জনসম্মুখে থাকলে কি তা আমাকে আঘাত করতে পারে?" এর প্রশ্ন নয়, বরং "এটি কি এপিআইয়ের অংশ হওয়া উচিত?"
Ordous

1
কেবলমাত্র আমি যুক্ত করব যে আপনি যদি একই জায়গাগুলি অন্য স্থানে পপিং করতে শুরু করেন তবে এটি অন্য শ্রেণিতে রিফ্যাক্টর করুন যাতে একাধিক শ্রেণি এটির ব্যবহার করতে পারে। বা যদি এটির সাথে শুরু হওয়া কোনও উদ্বেগ থাকে তবে এটিকে শুরু করতে আলাদা শ্রেণিতে সংজ্ঞা দিন।
jpmc26

1
আমি সরকারী ক্লাসগুলিকে সিল করব যেগুলিও বাড়ানো হবে না।
ডেন

ফাংশন (বা শ্রেণি) লুকিয়ে রাখা বা দেখানোর জন্য +1 হ'ল মূলত কোনও এপিআই সুরক্ষিত এবং রক্ষণাবেক্ষণের প্রশ্ন, এবং এটি কোডের ধরণের সাথে সম্পর্কিত নয়।
মার্কো

42

প্রশ্নটি পিছনের দিকে।

কোনও অনুষ্ঠানকে জন-পাবলিক করার জন্য আপনি কোনও কারণ অনুসন্ধান করছেন না। (আমার মতে) দিয়ে শুরু করা এটি একটি ভুল মানসিকতা। যুক্তি অন্যভাবে যেতে হবে।

অন্য কথায় - "আমি কেন এটি ব্যক্তিগত করব?" জিজ্ঞাসা করবেন না। জিজ্ঞাসা করুন: "আমি কেন এটিকে জনসমক্ষে প্রকাশ করব?"

সন্দেহ হলে, এটি প্রকাশ করবেন না। এটি ওখামের রেজারের মতো একরকম - প্রয়োজনের বাইরে এনটাইটেলাইটগুলি গুন করবেন না।

সম্পাদনা: @ টেলাস্টিনের মন্তব্যগুলিতে উত্থাপিত পাল্টা পরামর্শকে সম্বোধন করা (সেখানে বর্ধিত আলোচনা এড়াতে):

আমি এটি সময়ের সাথে সাথে শুনেছি এবং এটি বেশ কিছু সময়ের জন্য প্রচ্ছন্ন করেছি, তবে আমার অভিজ্ঞতায় জিনিসগুলি খুব বেশি ব্যক্তিগত বলে মনে হয়।

হ্যাঁ, কোনও শ্রেণি যদি উত্তরাধিকারের জন্য উন্মুক্ত থাকে তবে এটি কখনও কখনও ব্যথা হয় তবে আপনি কিছু ব্যক্তিগত পদ্ধতি (যার আচরণ আপনি পরিবর্তন করতে চান) এটি ওভাররাইড করতে পারবেন না।

তবে protectedযথেষ্ট হবে - এবং এটি এখনও সর্বজনীন।

এটি "প্রচলিত জিনিসগুলি প্রকাশ্যে হওয়া উচিত নয়" এগুলি পেতে প্রচুর কোড ডুপ্লিকেশন এবং ওভারহেডের দিকে নিয়ে যায় তবে পরোক্ষভাবে যাইহোক অ্যাক্সেস করা হয়।

এটি যদি সমস্যাযুক্ত হয়ে ওঠে, তবে কেবল এটিকে জনসাধারণ্যে প্রকাশ করুন! আমি যে প্রয়োজনীয়তার কথা বলছিলাম সেখানে রয়েছে :)

আমার বক্তব্যটি হ'ল আপনার ক্ষেত্রে এটি করা উচিত নয় (YAGNI এবং সমস্ত)।

নোট করুন যে কোনও ব্যক্তিগত ফাংশনটিকে গোপনীয়তায় ফিরিয়ে আনার চেয়ে সর্বজনীন করা সর্বদা সহজ। পরবর্তীটির বিদ্যমান কোডটি ভেঙে যাওয়ার সম্ভাবনা রয়েছে।


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

3
@ টেলাস্টিন আইএমএইচও, মনে হচ্ছে অ্যাপ্লিকেশনটি কিছু ডিজাইন মিসটপস দ্বারা ভুগছে; যদি আপনি নিজেকে কোনও পদ্ধতির বহিঃপ্রকাশের দিকে ঝুঁকেন বলে মনে করেন কারণ আপনাকে আলাদা কোডের পাথ জুড়ে ডাকতে হবে, সম্ভবত এটি একটি চিহ্ন যে এই পদ্ধতিটি তার নিজস্ব মডিউলে বিভক্ত হওয়া উচিত যেখানে উপযুক্ত যেখানে অন্তর্ভুক্ত করা যেতে পারে বা অন্তর্ভুক্ত করা যেতে পারে, বিশেষত যদি এটি খাঁটি ফাংশন থাকে ।
লিও

@ লেও - দুঃখিত, আমি অনুসরণ করি না। এর চেয়ে কম পূর্ণসংখ্যার মতো একটি কার্যকারিতা বিবেচনা করুন। এটি একটি দুর্দান্ত খাঁটি ফাংশন যা বিশেষভাবে উদ্ভাসিত হয় কারণ এটি যথাযথ যেখানে ইনজেকশনের মাধ্যমে অন্তর্ভুক্ত করা যায় (বা কেবল ব্যবহৃত হয়)।
টেলাস্টিন

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

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

6

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


5

ক্লাসগুলির একক দায়িত্বের নীতি অনুসরণ করা উচিত । যদিও কোনও শ্রেণীর লক্ষ্য অর্জনের জন্য অন্যান্য কার্যকারিতা ডাকা প্রয়োজন হতে পারে, তবে এটি কেবলমাত্র তার একক দায়িত্বের অংশ হিসাবে কাজগুলি প্রকাশ করতে হবে।

এখানে এমন একটি মামলার একটি উদাহরণ যেখানে দৃশ্যমানতা সমস্যার কারণ হতে পারে is

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

যেহেতু এটি একটি খাঁটি ফাংশন (স্ট্রিংটি আসে, এটি কোনওভাবে রূপান্তর করুন, একটি নতুন স্ট্রিং ফিরিয়ে দিন), ফলস্বরূপ এটি প্রকাশ্য বা ব্যক্তিগত হতে পারে। বা এটা করতে পারে?

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

ফাংশনটি ব্যক্তিগত রেখে, কারও কাছেই কোডের উপর নির্ভর করার সুযোগ নেই যা শ্রেণীর একক দায়িত্বের অংশ নয়।


2
আমি যুক্তি দিয়ে বলব যে এতে কেবলমাত্র প্রকাশ করা নয়, কেবল এটির ফাংশনগুলি থাকা উচিত যা এটির একক দায়িত্বের অংশ।
টেলাস্টিন

1
আমি মনে করি একটি ধূসর অঞ্চল আছে। আপনার কেবল StringTransformerদুটি জায়গায় বা তিনটি লাইনের কোডগুলি কেবল একটি জায়গায় ব্যবহার করা যেতে পারে তার জন্য পৃথক শ্রেণীর প্রয়োজন ? আমি একমত যে একবার কোড একাধিক স্থানে ব্যবহার করা গেলে এটি একটি দায়বদ্ধতার সাথে এটিকে নতুন শ্রেণিতে আলাদা করা ভাল, তবে একটি বাণিজ্য রয়েছে।

নিশ্চয়ই. নির্দেশিকা হ'ল গাইডলাইন, বিধি নয়।
টেলাস্টিন

@ স্নোম্যান অ জাভাতে আপনি কেবল ফাংশনগুলির একটি গ্রন্থাগার তৈরি করেন।
পিটার বি

@ পিটারবি এটি জাভা বনাম অন্য কিছু নয়। এটিকে সত্যই ও করার জন্য আপনার একটি কারখানা, কিছু বিমূর্ত ক্লাস ইত্যাদির প্রয়োজন হবে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.