সর্বনিম্ন বিস্ময়ের মূল নীতি (পোলা) এবং ইন্টারফেস


17

এক শতাব্দী আগে আমি যখন সি ++ শিখছিলাম, তখন আমাকে শিখানো হয়েছিল যে ইন্টারফেসগুলি ক্ষমা করা উচিত এবং যতদূর সম্ভব পদ্ধতিগুলি যে ক্রমগুলি আহ্বান করা হয়েছিল সে সম্পর্কে যত্ন নেওয়া উচিত না যেহেতু ভোক্তার পরিবর্তে উত্স বা নথিপত্র অ্যাক্সেস না পেতে পারে not এই.

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

কাদা হিসাবে পরিষ্কার?

এই পদ্ধতিগুলির সাথে একটি ইন্টারফেস বিবেচনা করুন (ডেটা ফাইল তৈরির জন্য):

OpenFile
SetHeaderString
WriteDataLine
SetTrailerString
CloseFile

এখন আপনি অবশ্যই এগুলি যথাযথভাবে যেতে পারেন তবে বলুন যে আপনি ফাইলের নাম (ভাবেন a.out) বা কোন শিরোলেখ এবং ট্রেলার স্ট্রিং অন্তর্ভুক্ত ছিল সে সম্পর্কে কোন চিন্তা করেননি , আপনি কেবল কল করতে পারেনAddDataLine

এর চেয়ে কম চূড়ান্ত উদাহরণ হ'ল শিরোনাম এবং ট্রেইলারগুলি বাদ দিতে পারে।

তবুও অন্যটি ফাইলটি খোলার আগে শিরোনাম এবং ট্রেলার স্ট্রিংগুলি সেট করে।

এটি ইন্টারফেস ডিজাইনের কোনও নীতি যা কোনও নাম দেওয়ার আগে স্বীকৃতিপ্রাপ্ত বা পোলা পথের একটি উপায়?

এনবি এই ইন্টারফেসের সংক্ষিপ্ত বিবরণে ডুবে যাবে না, এটি এই প্রশ্নের খাতিরে কেবল উদাহরণ।


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


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

2
প্রায়শই, একটি অপরিবর্তনীয় ইন্টারফেস যাইহোক ভাল। আপনি নির্মাণের সময় সেট করতে চান এমন সমস্ত ডেটা নির্দিষ্ট করতে পারেন। কোনও অস্পষ্টতা বাকি নেই এবং ক্লাস লিখতে সহজ হয়ে যায়। (কখনও কখনও এই স্কিম অবশ্যই সম্ভব নয়।)
usr ডিরেক্টরির

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

উত্তর:


25

একটি উপায় যার মাধ্যমে আপনি কমপক্ষে অবাক হওয়ার নীতিটিতে আটকে থাকতে পারেন তা হ'ল আইএসপি এবং এসআরপি , এমনকি ডিআরওয়াই প্রভৃতি নীতিগুলি বিবেচনা করা to

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

সম্পাদনা / আপডেট: এটি এও প্রস্তাব করে যে এআইপিআই নিজেই ব্যবহারকারীকে ডিআরওয়াই লঙ্ঘন করতে বলছে, কারণ প্রতিবার এপিআই ব্যবহার করার সময় তাদের একই পদক্ষেপগুলি পুনরাবৃত্তি করতে হবে

একটি বিকল্প এপিআই বিবেচনা করুন যেখানে আইও অপারেশনগুলি ডেটা অপারেশন থেকে পৃথক। এবং যেখানে API নিজেই অর্ডারিংয়ের 'মালিকানাধীন':

ContentBuilder

SetHeader( ... )
AddLine( ... )
SetTrailer ( ... )

FileWriter

Open(filename) 
Write(content) throws InvalidContentException
Close()

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

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

কোনও এআইপি ডিজাইনের সময় আপনার ত্রুটি প্রতিবেদন করাও বিবেচনা করা উচিত, তা সে রাষ্ট্র, ফেরতের মান, ব্যতিক্রম, কলব্যাক, বা অন্য কিছু। এপিআই-র ব্যবহারকারী সম্ভবত তার চুক্তির কোনও লঙ্ঘন প্রোগ্রাম, বা এমন ফাইল যা I / O ত্রুটি নিয়ন্ত্রণ করতে পারে না এমন অন্যান্য ত্রুটিগুলি সনাক্ত করতে সক্ষম হতে পারে।


ঠিক আমি যা খুঁজছিলাম - ধন্যবাদ! আইএসপি নিবন্ধ থেকে: "(আইএসপি) বলেছে যে কোনও ক্লায়েন্টকে যে পদ্ধতিগুলি ব্যবহার না করে তার উপর নির্ভর করতে বাধ্য করা উচিত নয়"
রবি ডি

5
এটি কোনও খারাপ উত্তর নয়, তবুও সামগ্রীর নির্মাতাকে এমনভাবে প্রয়োগ করা যেতে পারে যেখানে কল SetHeaderবা আদেশের বিষয়টি অর্ডার AddLineকরে। এই অর্ডার নির্ভরতা নির্মূল করার জন্য না আইএসপি বা এসআরপি হয় না, এটি কেবল পোলাও।
ডক ব্রাউন

অর্ডার সম্পর্কিত বিষয়গুলি, আপনি এখনও অপারেশনগুলি সংজ্ঞায়িত করে পোলা সন্তুষ্ট করতে পারেন যে পরবর্তী পদক্ষেপগুলি সম্পাদন করার জন্য পূর্ব ধাপগুলি থেকে ফেরত আসা একটি মান প্রয়োজন, যার ফলে প্রকারের সিস্টেমের সাথে অর্ডার প্রয়োগ করা হয়। FileWriterঅতঃপর সমস্ত ইনপুট সামগ্রী সম্পূর্ণ হওয়া নিশ্চিত করার জন্য পদ্ধতির শেষ ContentBuilderপদক্ষেপের থেকে মানটির প্রয়োজন হতে পারে Write, InvalidContentExceptionঅপ্রয়োজনীয় করে তোলা।
ড্যান লিয়নস

@ ড্যানলায়ানসকে আমি মনে করি যে এটি জিজ্ঞাসাবাদী যে পরিস্থিতি এড়াতে চাইছে তার চেয়ে বরং কাছাকাছি; যেখানে এপিআই ব্যবহারকারীর অর্ডার সম্পর্কে জানতে বা যত্ন নেওয়া দরকার। আদর্শভাবে, এপিআই নিজেই আদেশটি প্রয়োগ করা উচিত, অন্যথায় এটি ব্যবহারকারীকে ডিআরওয়াই লঙ্ঘন করতে সম্ভাব্যভাবে বলছে। বিভাজন ContentBuilderএবং FileWriter.Writeজ্ঞান যে বিট encapsulate করার অনুমতি দেয় কারণ । বিষয়বস্তুতে কিছু ভুল হতে না পারার ক্ষেত্রে ব্যতিক্রমটি প্রয়োজনীয় হবে (যেমন অনুপস্থিত শিরোনাম)। একটি রিটার্নও কাজ করতে পারে, তবে আমি ব্যতিক্রমগুলি রিটার্ন কোডগুলিতে রূপ দেওয়ার ভক্ত নই।
বেন কট্রেল

তবে স্পষ্টতই ডিআরওয়াই সম্পর্কে আরও নোট যুক্ত করা এবং উত্তরটি অর্ডার করা।
বেন কট্রেল

12

এটি কেবল পোলা সম্পর্কেই নয়, বাগের সম্ভাব্য উত্স হিসাবে অবৈধ অবস্থা প্রতিরোধ সম্পর্কেও।

আসুন দেখুন কীভাবে আমরা আপনার উদাহরণকে কোনও কংক্রিট বাস্তবায়ন না করে কিছু প্রতিবন্ধকতা সরবরাহ করতে পারি:

প্রথম পদক্ষেপ: কোনও ফাইল খোলার আগে কোনও কিছু কল করার অনুমতি দেবেন না।

CreateDataFileInterface
  + OpenFile(filename : string) : DataFileInterface

DataFileInterface
  + SetHeaderString(header : string) : void
  + WriteDataLine(data : string) : void
  + SetTrailerString(trailer : string) : void
  + Close() : void

এখন এটি সুস্পষ্ট হওয়া CreateDataFileInterface.OpenFileউচিত যে একটি DataFileInterfaceউদাহরণ পুনরুদ্ধার করার জন্য অবশ্যই কল করা উচিত , যেখানে আসল ডেটা লেখা যেতে পারে।

দ্বিতীয় পদক্ষেপ: নিশ্চিত করুন, শিরোনাম এবং ট্রেইলার সর্বদা সেট করা আছে।

CreateDataFileInterface
  + OpenFile(filename : string, header: string, trailer : string) : DataFileInterface

DataFileInterface
  + WriteDataLine(data : string) : void
  + Close() : void

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


মন্তব্যে জবাব দিতে:

আমি ইন্টারফেসের বিচ্ছেদ পছন্দ করি। তবে আমি ভাবতে আগ্রহী যে বাস্তবায়ন সম্পর্কে আপনার পরামর্শ (উদাঃ WritTrailerAndClose ()) এসআরপি লঙ্ঘনের বিষয়ে ভার্জিং করছে। (এটি এমন একটি বিষয় যা আমি বেশ কয়েকটি উপলক্ষে লড়াই করেছি, তবে আপনার পরামর্শটি সম্ভবত একটি সম্ভাব্য উদাহরণ বলে মনে হচ্ছে)) আপনি কীভাবে প্রতিক্রিয়া জানান?

সত্য। আমি আমার বক্তব্য গঠনের প্রয়োজনের চেয়ে উদাহরণটিতে বেশি মনোনিবেশ করতে চাইনি, তবে এটি একটি ভাল প্রশ্ন। এই ক্ষেত্রে আমি মনে করি আমি এটি কল করব Finalize(trailer)এবং তর্ক করব যে এটি খুব বেশি করে না। ট্রেলার লিখতে এবং বন্ধ করা কেবল বাস্তবায়নের বিশদ। তবে যদি আপনি মতানৈক্য করেন বা একই রকম পরিস্থিতি যেখানে এটি আলাদা তবে এখানে একটি সম্ভাব্য সমাধান রয়েছে:

CreateDataFileInterface
  + OpenFile(filename : string, header : string) : IncompleteDataFileInterface

IncompleteDataFileInterface
  + WriteDataLine(data : string) : void
  + FinalizeWithTrailer(trailer : string) : CompleteDataFileInterface

CompleteDataFileInterface
  + Close()

আমি আসলে এই উদাহরণটির জন্য এটি করব না তবে এটি কৌশলটি কীভাবে বহন করবে তা দেখায়।

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


1
আপনি হায়রে ফাঁদে পড়েছেন আমি আপনাকে স্পষ্টভাবে সতর্ক করে দিয়েছিলাম শুরু থেকে বাঁচতে। একটি ফাইলের নাম প্রয়োজন হয় না - শিরোনাম এবং ট্রেইলারও নয়। তবে ইন্টারফেসটি বিভক্ত করার সাধারণ থিমটি একটি ভাল তাই +1 :-)
রবি ডি

ওহ, তবে আমি আপনাকে ভুল বুঝেছিলাম, আমি ভেবেছিলাম এটি ব্যবহারকারীর উদ্দেশ্য বর্ণনা করছে, বাস্তবায়ন নয়।
ফ্যাবিয়ান শেমংলার

আমি ইন্টারফেসের বিচ্ছেদ পছন্দ করি। তবে আমি ভাবতে আগ্রহী যে বাস্তবায়ন সম্পর্কে আপনার পরামর্শ (উদাঃ WriteTrailerAndClose()) এসআরপি লঙ্ঘনের উপর ভিত্তি করে চলেছে। (এটি এমন একটি বিষয় যা আমি বেশ কয়েকটি উপলক্ষে লড়াই করেছি, তবে আপনার পরামর্শটি সম্ভবত একটি সম্ভাব্য উদাহরণ বলে মনে হচ্ছে)) আপনি কীভাবে প্রতিক্রিয়া জানান?
কিমিওট

1
@ কেমোটের উত্তর একটি মন্তব্যের জন্য দীর্ঘ ছিল, আমার আপডেট দেখুন
ফ্যাবিয়ান শেমংলার

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