কী জিজ্ঞাসা করবেন না জিজ্ঞাসা এবং প্রশ্ন পৃথকীকরণের মধ্যে কীভাবে চয়ন করবেন?


25

জিজ্ঞাসা করবেন না জিজ্ঞাসা নীতিটি বলে:

আপনি অবজেক্টগুলি তাদের কী করতে চান তা বলার চেষ্টা করা উচিত; তাদের রাষ্ট্র সম্পর্কে প্রশ্ন জিজ্ঞাসা করবেন না, সিদ্ধান্ত নিন এবং তারপরে তাদের কী করবেন তা বলুন।

সমস্যাটি হ'ল, আহ্বানকারী হিসাবে, আপনাকে বলা হওয়া অবজেক্টের অবস্থার উপর ভিত্তি করে সিদ্ধান্ত নেওয়া উচিত নয় যা ফলস্বরূপ আপনাকে বস্তুর অবস্থা পরিবর্তন করে changing আপনি যে যুক্তিটি বাস্তবায়ন করছেন এটি সম্ভবত আপনার নয়, অবজেক্টের দায়বদ্ধতা। আপনি অবজেক্টের বাইরে সিদ্ধান্ত নেওয়ার জন্য এর এনক্যাপসুলেশন লঙ্ঘন করে।

একটি সহজ উদাহরণ "বলুন, জিজ্ঞাসা করবেন না" হয়

Widget w = ...;
if (w.getParent() != null) {
  Panel parent = w.getParent();
  parent.remove(w);
}

এবং বলুন সংস্করণটি হ'ল ...

Widget w = ...;
w.removeFromParent();

তবে যদি অপসারণের থেকে আমার পিতামাতার পদ্ধতিটি জানা দরকার? আমার প্রথম প্রতিক্রিয়া হ'ল অপসারণটি পরিবর্তন করে পিতামাতার অপসারণ করা হয়েছে বা না থাকলে বুলেটিয়ান ডোনোটিং ফিরিয়ে দিতে rom

তবে আমি কমান্ড ক্যোয়ারী বিচ্ছেদ প্যাটার্ন জুড়ে এসেছি যা বলে না যে এটি করা উচিত নয়।

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

এই দুটি কি একে অপরের সাথে মতবিরোধের মধ্যে রয়েছে এবং আমি কীভাবে এই দুজনের মধ্যে বেছে নেব? আমি কি এই বিষয়ে প্র্যাকমেটিক প্রোগ্রামার বা বার্ট্রান্ড মেয়ের সাথে যাব?


1
আপনি বুলিয়ান দিয়ে কি করবেন?
ডেভিড

1
দেখে মনে হচ্ছে আপনি ব্যবহারের ক্ষেত্রে ভারসাম্য না রেখে কোডিং প্যাটার্নগুলিতে অনেক দূরে ডাইভিং করছেন
ইজকাটা

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

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

1
কমান্ড ক্যোয়ারী বিচ্ছেদ একটি নীতি, কোনও প্যাটার্ন নয়। প্যাটার্নগুলি এমন একটি জিনিস যা আপনি কোনও সমস্যার সমাধান করতে ব্যবহার করতে পারেন। নীতিগুলি হ'ল সমস্যাগুলি তৈরি না করতে আপনি যা অনুসরণ করেন।
candied_orange

উত্তর:


25

আসলে আপনার উদাহরণের সমস্যাটি ইতিমধ্যে পচনের অভাবের চিত্র তুলে ধরেছে।

আসুন এটি কিছুটা পরিবর্তন করুন:

Book b = ...;
if (b.getShelf() != null) 
    b.getShelf().remove(b);

এটি আসলে আলাদা নয়, তবে ত্রুটিগুলি আরও প্রকট করে তোলে: বইটি কেন তার তাক সম্পর্কে জানবে? সহজ কথায় বলতে গেলে তা করা উচিত নয়। এটি তাকের উপর বইগুলির নির্ভরতার পরিচয় দেয় (যা কোনও মানে হয় না) এবং বিজ্ঞপ্তিযুক্ত রেফারেন্স তৈরি করে। সব খারাপ।

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

বইয়ের উদাহরণে ফিরে আসতে - গ্রন্থাগারিক প্রবেশ করান:

Librarian l = ...;
Book b = ...;
l.findShelf(b).remove(b);

দয়া করে বুঝতে পারেন, আমরা বলার অর্থে আর জিজ্ঞাসা করছি না, জিজ্ঞাসা করবেন না

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

গ্রন্থাগারিকের পরিচয়ের সাথে আমরা এই সম্পর্কটিকে আলাদাভাবে মডেল করি, তাই উদ্বেগের বিচ্ছেদ অর্জন করি।


আমি মনে করি এটি একটি খুব বৈধ পয়েন্ট, তবে প্রশ্নের কোনও উত্তর দেয় না। আপনার সংস্করণে প্রশ্নটি হল, শেল্ফ ক্লাসে মুছে ফেলার (বুক বি) পদ্ধতির কি কোনও ফেরতের মান থাকতে হবে?
স্কার্ফ্রিজে

1
@ স্কারফ্রিজ: নীচের লাইনে, জিজ্ঞাসা করবেন না যে উদ্বেগের যথাযথ পৃথকীকরণের এক বাস্তবতা। আপনি যদি এটি সম্পর্কে চিন্তা করেন, আমি এইভাবে প্রশ্নের উত্তর দেব। কমপক্ষে আমিও তাই
ভাবব

1
@ এসফারফ্রিজে কোনও রিটার্ন মানের পরিবর্তে, একটি ফাংশন / প্রতিনিধি পাস করতে পারে যা ব্যর্থতার আহ্বান জানায়। যদি সফল হয়, ঠিক হয়ে গেছে?
ইয়াহু

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

13

আপনার যদি ফলাফলটি জানা দরকার তবে আপনি তা করেন; এটা আপনার প্রয়োজন

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

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

কমান্ড / ক্যোয়ারী বিচ্ছেদটি সম্পাদন করতে আপনাকে একটি পদ্ধতি দিয়ে ফাইল অপারেশন করতে হবে, এবং তারপরে অন্য পদ্ধতির সাথে এর ফলাফলটি পরীক্ষা করতে হবে, এটি একটি অনাকাঙ্ক্ষিত কৌশল কারণ এটি ফলাফলটি ঘটানো পদ্ধতি থেকে ফলাফলকে ডেসপুল করে। যদি ফাইল কল এবং স্থিতি পরীক্ষার মধ্যে আপনার অবজেক্টের অবস্থার সাথে কিছু ঘটে?

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

এটি কমান্ড ক্যোয়ারী পৃথককরণের সাথে মোটেই বিরোধী নয়; প্রকৃতপক্ষে, এটি আরও কার্যকর করে, কারণ স্থিতির উদ্দেশ্যে কোনও বাহ্যিক পদ্ধতি প্রকাশ করার দরকার নেই।


1
কেউ তর্ক করতে পারে যে আপনার উদাহরণস্বরূপ, "লিখন" অপারেশন ব্যর্থ হলে একটি ব্যতিক্রম ছুঁড়ে ফেলা উচিত, সুতরাং "গ্যাট স্ট্যাটাস" পদ্ধতির দরকার নেই for
ডেভিড

@ ডেভিড: তারপরে ওপি-র উদাহরণের দিকে ফিরে যান, যা আসলে পরিবর্তন ঘটে যদি সত্য ঘটে, যদি তা না ঘটে তবে মিথ্যা। আমি সন্দেহ করি আপনি সেখানে একটি ব্যতিক্রম ছুঁড়ে দিতে চাইবেন।
রবার্ট হার্ভে

এমনকি ওপি-র উদাহরণও আমার কাছে সঠিক মনে হয় না। হয় অপসারণ সম্ভব না হলে আপনি খেয়াল করতে চান, এক্ষেত্রে আপনি ব্যতিক্রম ব্যবহার করবেন বা কোনও উইজেট আসলে সরানো হবে যখন আপনি ইভেন্ট বা কলব্যাক প্রক্রিয়াটি ব্যবহার করতে পারবেন সেদিকে খেয়াল রাখতে চান। আমি কেবল এমন বাস্তব উদাহরণ দেখতে পাচ্ছি না যেখানে আপনি "কমান্ড ক্যোয়ারী বিচ্ছেদ প্যাটার্ন"
ডেভিড

@ ডেভিড: আমি পরিষ্কার করতে আমার উত্তর সম্পাদনা করেছি have
রবার্ট হার্ভে

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

2

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

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

পরে আপনি কীভাবে মোকাবেলা করবেন তা আপনার জিনিস। আপনি এটির উপরে একটি বিমূর্ততা তৈরি করতে পারেন, এর সাথে একটি উইজেট টাইপ removeFromParent()করতে পারেন তবে আপনার সর্বদা নিম্ন-স্তরের ফলব্যাক হওয়া উচিত, অন্যথায় আপনার সম্ভবত অকাল অনুমান করা হয়েছিল।

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


2

আপনি যা বর্ণনা করেন তা হ'ল কমান্ড-কোয়েরি বিচ্ছেদ নীতিটির একটি পরিচিত "ব্যতিক্রম"।

এই নিবন্ধে মার্টিন ফোলার ব্যাখ্যা করেছেন যে তিনি কীভাবে এই ধরনের ব্যতিক্রমকে হুমকি দিতেন।

মায়ার কমান্ড-ক্যোয়ারী বিভাজন একেবারে ব্যবহার করতে পছন্দ করে তবে ব্যতিক্রম রয়েছে। স্ট্যাক পপিং এমন একটি ক্যোয়ারির একটি ভাল উদাহরণ যা রাষ্ট্রকে পরিবর্তন করে। মায়ার সঠিকভাবে বলেছেন যে আপনি এই পদ্ধতিটি এড়াতে পারবেন তবে এটি একটি দরকারী প্রতিমা। সুতরাং আমি যখন চাই তখন এই নীতিটি অনুসরণ করতে পছন্দ করি তবে আমার পপ পেতে এটি ভাঙতে প্রস্তুত।

আপনার উদাহরণে আমি একই ব্যতিক্রম বিবেচনা করব।


0

কমান্ড-ক্যোয়ারী বিচ্ছেদ বিভ্রান্ত করা আশ্চর্যরকম সহজ।

যদি আমি আমার সিস্টেমে আপনাকে বলি যে একটি কমান্ড রয়েছে যা একটি কোয়েরি থেকে একটি মানও দেয় এবং আপনি "হা! আপনি লঙ্ঘন করছেন!" আপনি বন্দুক লাফিয়ে যাচ্ছেন

না, এটাই নিষিদ্ধ নয়।

নিষিদ্ধ কি যখন সেই আদেশটি সেই ক্যোয়ারী করার একমাত্র উপায়। না। প্রশ্ন জিজ্ঞাসার জন্য আমার রাষ্ট্র পরিবর্তন করা উচিত নয়। এর অর্থ এই নয় যে প্রতিবার যখন আমি রাষ্ট্র পরিবর্তন করি তখন আমাকে চোখ বন্ধ করতে হবে।

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

আসল অর্থটি এত জঘন্য সূক্ষ্ম যে অলস লোকের পক্ষে সেটটারদের শূন্য হওয়া উচিত বলা সহজ। এটি নিশ্চিত হওয়া সহজ করে তোলে যে আপনি প্রকৃত নিয়ম লঙ্ঘন করছেন না তবে এটি একটি অতিরিক্ত প্রতিক্রিয়া যা সত্যিকারের ব্যথা হতে পারে।

সাবলীল ইন্টারফেস এবং আইডিএসএল এর সর্বদা এই অতিমাত্রায় "লঙ্ঘন"। আপনার প্রতিক্রিয়া দেখা দিলে অনেক শক্তি উপেক্ষা করা হচ্ছে।

আপনি যুক্তি দিতে পারেন যে কমান্ডের কেবল একটি কাজ করা উচিত এবং কোয়েরিতে কেবল একটি কাজ করা উচিত। এবং অনেক ক্ষেত্রে এটি একটি ভাল পয়েন্ট। কে বলতে চাই যে কেবলমাত্র একটিই ক্যোয়ারী রয়েছে যা একটি আদেশ অনুসরণ করা উচিত? ভাল তবে এটি কমান্ড-কোয়েরি পৃথকীকরণ নয়। এটি একক দায়িত্বের নীতি।

এইভাবে দেখে এবং স্ট্যাক পপটি কিছু উদ্ভট ব্যতিক্রম নয়। এটি একক দায়িত্ব যদি আপনি উঁকি দিতে ভুলে যান তবে পপ কেবল কমান্ড ক্যোয়ারী বিচ্ছেদ লঙ্ঘন করে।

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