ডেমিটারের আইন অনুসারে, কোনও শ্রেণি কি তার সদস্যদের একজনকে ফেরত দেওয়ার অনুমতি দেয়?


13

ডেমিটারের আইন সম্পর্কে আমার তিনটি প্রশ্ন রয়েছে।

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

সিউডো কোডে:

class A {}

class B {

    private A a;

    public A getA() {
        return this.a;
    }
}

class C {

    private B b;
    private X x;

    public void main() {
        // Is it okay for B.getA to exist?
        A a = this.b.getA();

        a.doSomething();

        x.doSomethingElse(a);
    }
}

আমি সন্দেহ করি যে ডেমিটারের আইন উপরের মতো কোনও প্যাটার্ন নিষিদ্ধ করে। doSomethingElse()আইন লঙ্ঘন না করে এটিকে ডাকা যেতে পারে তা নিশ্চিত করতে আমি কী করতে পারি (3)?


9
প্রচুর লোকেরা (বিশেষত ফাংশনাল প্রোগ্রামাররা) ল্যামিটের আইনটিকে একটি অ্যান্টি-প্যাটার্ন হিসাবে দেখেন। অন্যরা এটিকে "ডেমিটারের মাঝে মাঝে দরকারী পরামর্শ" হিসাবে দেখেন।
ডেভিড হামেন

1
আমি এই প্রশ্নটিকে উচ্চতর করতে যাচ্ছি কারণ এটি আইন-শৃঙ্খলা রক্ষাকারী আইনকে অযৌক্তিকভাবে তুলে ধরে। হ্যাঁ, এলওডি "মাঝে মাঝে দরকারী", তবে এটি সাধারণত বোকা।
user949300

কীভাবে xসেট হচ্ছে?
candied_orange

@ ক্যান্ডিওড আরঞ্জ xহ'ল একটি পৃথক সম্পত্তি যার মূল্য হ'ল কিছু বস্তু যা অনুরোধ করতে সক্ষম doSomethingElse
ব্যবহারকারী 2180613

1
আপনার উদাহরণ LOD লঙ্ঘন করে না। এলওডি একটি অবজেক্টের ক্লায়েন্টদের অভ্যন্তরীণ বিশদ বা সহযোগীদের সাথে মিলিত হওয়া থেকে বিরত রাখার বিষয়ে। আপনি মত জিনিস এড়াতে চান user.currentSession.isLoggedIn()। কারণ এটি userকেবল ক্লায়েন্টকেই নয় userএর সহযোগী হিসাবেও যুক্ত করে session। পরিবর্তে আপনি লিখতে সক্ষম হতে চান user.isLoggedIn()। যার সাধারণত বাস্তবায়ন প্রতিনিধিদের এমন একটি isLoggedInপদ্ধতি যুক্ত করে এটি অর্জন করা userহয় currentSession
জোনা

উত্তর:


7

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

আপনি ডোমেন ড্রাইভড ডিজাইনটি সন্ধান করতে চাইতে পারেন, যা আপনাকে কার্যকারিতা কোথায় যেতে হবে এবং কাকে কী চাওয়া উচিত সে সম্পর্কে যুক্তিযুক্ত আরও কিছু নানান বৌদ্ধিক সেট দেবে।

অপরিবর্তনীয় বস্তু সম্পর্কিত আপনার দ্বিতীয় প্রশ্ন একটি সত্তা বস্তুর তুলনায় একটি
মান বস্তুর ধারণাকে বোঝায় to ডিডিডি-তে, আপনি প্রায় কোনও সীমাবদ্ধতা ছাড়াই মূল্য অবজেক্টগুলি পাস করতে পারেন। এটি সত্তা বস্তুর জন্য সত্য কথা বলে না।

সরল LOD সমষ্টিগুলিকে অ্যাক্সেস করার নিয়ম হিসাবে ডিডিডিতে আরও ভালভাবে প্রকাশিত । কোনও বাহ্যিক বস্তুর সমষ্টিগুলির সদস্যদের রেফারেন্স রাখা উচিত নয়। শুধুমাত্র একটি মূল রেফারেন্স রাখা উচিত।

ডিডিডি একদিকে রেখে, আপনি কমপক্ষে আপনার ক্লাসের জন্য নিজের স্টেরিওটাইপগুলির নিজস্ব সেটগুলি বিকাশ করতে চান যা আপনার ডোমেনের জন্য যুক্তিসঙ্গত। আপনি আপনার সিস্টেমটি ডিজাইন করার সাথে সাথে এই স্টেরিওটাইপগুলি সম্পর্কে নিয়মগুলি প্রয়োগ করুন।

এছাড়াও সর্বদা মনে রাখবেন যে এই সমস্ত বিধিগুলি জটিলতা পরিচালনা করার জন্য, নিজের হাতছাড়া করার জন্য নয়।


1
ক্লাবের সদস্যদের যেমন ডেটা প্রকাশ করা যায় (অর্থাত্ গ্রাহকদের উপস্থিত থাকা উচিত) সে বিষয়ে ডিডিডি কোনও নিয়ম সরবরাহ করে? সকল আলোচনা প্রায় Law of Demeter, tell, don't ask, getters are evil, object encapsulationএবং single responsibility principleযেমন বস্তুর ভ্যালু পাচ্ছি এবং এটির সাথে কিছু কাজ উল্টোদিকে যখন একটি ডোমেইন বস্তু প্রতিনিধিদল ব্যবহার করা উচিত: এই প্রশ্নের ফুটাইয়া কমান বলে মনে হচ্ছে? এই জাতীয় সিদ্ধান্ত গ্রহণ করা উচিত এমন পরিস্থিতিতে সংক্ষিপ্ত যোগ্যতা প্রয়োগ করতে সক্ষম হওয়া খুব দরকারী হবে be
ব্যবহারকারী 2180613

"Getters are মন্দ" এর মতো নির্দেশিকা বিদ্যমান কারণ অনেক লোক শ্রেণীর দৃষ্টান্তটিকে ডেটা স্ট্রাকচার হিসাবে গণ্য করে (এক ব্যাগের চারপাশে পাস করার জন্য)। এটি বস্তু-ভিত্তিক প্রোগ্রামিং নয়। অবজেক্টগুলি কার্যকারিতা / আচরণের বান্ডিল যা আসলে কিছু কাজ সরবরাহ করে। কাজের সুযোগটি দায়িত্ব দ্বারা সংজ্ঞায়িত করা হয়। এই কাজটি স্পষ্টতই এমন বস্তু তৈরি করতে চলেছে যা পদ্ধতিগুলি থেকে ফিরে আসে etc. ইত্যাদি If যদি আপনার শ্রেণিটি আসলে অর্থবহ কাজ করে যা আপনি "Y এবং Z এর গুণাবলী সহ ডেটা অবজেক্ট এক্সকে উপস্থাপন করেন" এর বাইরেও পরিষ্কারভাবে সংজ্ঞায়িত করতে পারেন তবে আপনি সঠিক পথে আছেন । আমি এটা উপর চাপ দিতে হবে না।
জেরেমি

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

ডোমেন-ড্রাইভড ডিজাইন বাস্তবায়নকারী তাঁর বইয়ে ভন ভার্ননের ল অফ ডেমিটারের একটি উল্লেখ রয়েছে এবং বলুন, জিজ্ঞাসা করবেন না সিএইচ 10, পিপি 382 you আপনার যদি এটির অ্যাক্সেস থাকে তবে এক নজরে নজর রাখা উচিত।
জেরেমি

6

ডেমিটারের আইন অনুসারে, কোনও শ্রেণি কি তার সদস্যদের একজনকে ফেরত দেওয়ার অনুমতি দেয়?

হ্যাঁ এটি অবশ্যই হয়।

আসুন মূল বিষয়গুলি দেখুন :

  • প্রতিটি ইউনিটের অন্যান্য ইউনিট সম্পর্কে কেবল সীমিত জ্ঞান থাকা উচিত: কেবলমাত্র ইউনিট বর্তমান ইউনিটের সাথে "ঘনিষ্ঠভাবে" সম্পর্কিত।
  • প্রতিটি ইউনিট শুধুমাত্র তার বন্ধুদের সাথে কথা বলা উচিত; অপরিচিতদের সাথে কথা বলবেন না
  • কেবল আপনার নিকটবর্তী বন্ধুদের সাথে কথা বলুন।

তিনটিই আপনাকে একটি প্রশ্ন জিজ্ঞাসা করতে ছেড়ে দেয়: বন্ধু কে?

কী ফিরবেন সে সিদ্ধান্ত নেওয়ার সময়, লিমিটার অফ ডেমিটার বা ন্যূনতম জ্ঞানের নীতি (এলওডি) নির্দেশ দেয় না যে আপনি কোডারগুলির বিরুদ্ধে প্রতিরক্ষা করেন যা এটি লঙ্ঘন করার পক্ষে জোর দেয়। এটি নির্দেশ দেয় যে আপনি কোডারদের এটি লঙ্ঘন করতে জোর করবেন না।

এগুলি বিভ্রান্ত হওয়া ঠিক এ কারণেই কেন অনেকে মনে করে যে কোনও সেটার সর্বদা শূন্য হওয়া উচিত। না। আপনাকে অবশ্যই কোয়েরি (গেটার্স) তৈরির এমন একটি উপায়ের অনুমতি দিতে হবে যা সিস্টেমের অবস্থা পরিবর্তন করে না। এটি বেসিক কমান্ড কোয়েরি বিচ্ছেদ

এর অর্থ কি আপনি যা চান তা এক সাথে শৃঙ্খলাবদ্ধ কোড বেজে প্রবেশ করতে মুক্ত? না। এক সাথে শৃঙ্খলাবদ্ধ যা কেবল এক সাথে বেঁধে রাখা হয়েছিল। অন্যথায় চেইন বদলে যেতে পারে এবং হঠাৎ আপনার জিনিসগুলি ভেঙে যায়। এটিই বন্ধুরা বোঝাতে চাইছে।

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

ক্লাস ছাড়াও যা নির্দিষ্টভাবে বস্তুগুলি ফিরিয়ে দেওয়ার জন্য নিযুক্ত করা হয়েছিল - যেমন কারখানা এবং বিল্ডার ক্লাস - কোনও কোনও জিনিস ফেরত দেওয়া কোনও পদ্ধতির পক্ষে ঠিক আছে, উদাহরণস্বরূপ কোনও শ্রেণীর কোনও বৈশিষ্ট্য দ্বারা রক্ষিত কোনও বস্তু যা ডিমেটারের আইনকে লঙ্ঘন করে (1) ?

এটি কেবলমাত্র ডিমিটার লঙ্ঘনের সুযোগ তৈরি করে। এটি লঙ্ঘন নয়। এটি অগত্যা খারাপও নয়।

এবং যদি এটি ডেমিটারের আইন লঙ্ঘন করে তবে কী বিষয়টি বিবেচিত হবে যদি প্রত্যাবর্তিত বস্তুটি একটি স্থাবর বস্তু যা কোনও টুকরো উপাত্ত উপস্থাপন করে এবং এই ডেটার (2) এর জন্য গেটরস ব্যতীত আর কিছুই না করে?

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

সিউডো কোডে:

আমি সন্দেহ করি যে ডেমিটারের আইন উপরের মতো কোনও প্যাটার্ন নিষিদ্ধ করে। আইন (3) লঙ্ঘন না করে doSomethingElse () বলা যেতে পারে তা নিশ্চিত করতে আমি কী করতে পারি?

আমি কথা বলার আগে x.doSomethingElse(a)বুঝতে হবে যে আপনি মূলত লিখেছেন

b.getA().doSomething()

এখন, এলওডি ডট গণনা অনুশীলন নয় । তবে আপনি যখন একটি শৃঙ্খলা তৈরি করবেন আপনি যখন বলছেন যে আপনি কীভাবে A(ব্যবহার করে B) পেতে চান এবং আপনি কীভাবে এটি ব্যবহার করতে হয় তা জানেন A। এখনই Aএবং Bআরও ভাল ঘনিষ্ঠজন ছিল কারণ আপনি কেবল তাদের একত্রিত করেছেন।

আপনি শুধু হাত কিছুর জন্য জিজ্ঞাসা করেছিলেন আপনি একটি Aজিনিস ভালো আপনি ব্যবহার করতে পারে Aএবং যত্ন নিত হতো না এটা কোথায় থেকে এসেছে এবং Bপেয়ে সঙ্গে একটি জীবন সুখী ও আপনার আবেশ থেকে মুক্ত বাঁচতে পারে Aথেকে B

হিসাবে x.doSomethingElse(a)যেখানে বিবরণ ছাড়া xথেকে এসেছিলেন, লোদ এ সব কিছুই এটি সম্পর্কে বলার আছে।

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

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

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


বন্ধুত্বের কিছু ধারণা থাকার কারণে ফ্লুয়েড ইন্টারফেসগুলি এলওডের ব্যতিক্রম নয় .... একটি সাবলীল ইন্টারফেসে শৃঙ্খলে থাকা প্রতিটি পদ্ধতিকে একই বস্তুতে ডাকা হয়, কারণ তারা সমস্তই স্ব-স্ব ফিরে আসে। settings.darkTheme().monospaceFont()কেবল সিনট্যাকটিক চিনিsettings.darkTheme(); settings.monospaceFont();
জোনা

3
@ জোনাঃ ফিরে আসা চূড়ান্ত বন্ধুত্ব। এবং সমস্ত সাবলীল ইন্টারফেস না। বিভিন্ন আইডিএসে উপলব্ধ পদ্ধতিগুলি পরিবর্তনের জন্য অনেকগুলি আইডিএসএল সাবলীল এবং বিভিন্ন ধরণের ফেরত দেয়। বিবেচনা করুন jOOQ , ধাপ রচয়িতা , জাদুকর রচয়িতা , আর আমার নিজের দুঃস্বপ্নের দৈত্য রচয়িতা । সাবলীল একটি শৈলী। প্যাটার্ন নয়।
candied_orange

2

ক্লাস ছাড়াও যা নির্দিষ্টভাবে বস্তু ফেরত দেওয়ার জন্য নিযুক্ত করা হয়েছিল [...]

আমি এই যুক্তি বেশ বুঝতে পারি না। কোনও বার্তা কোনও বার্তা আহ্বানের ফলে কোনও বস্তু ফেরত দিতে পারে। বিশেষত যদি আপনি "অবজেক্ট হিসাবে সবকিছু" মনে করেন।

ক্লাসগুলি হ'ল একমাত্র অবজেক্ট যা তাদের নিজস্ব নতুন বস্তুগুলিকে "নতুন" বার্তা প্রেরণ করে (বা প্রায়শই সাধারণ ওওপি ভাষায় নতুন কীওয়ার্ড দ্বারা প্রতিস্থাপন করা হয়) প্রেরণ করে can


যাইহোক, আপনার প্রশ্নের বিষয়ে আমি অন্য কোনও জায়গায় ব্যবহার করার জন্য কোনও বস্তুর তার কোনও বৈশিষ্ট্য ফিরিয়ে দেওয়া সম্পর্কে সন্দেহজনক হয়ে যাব। এটি হতে পারে যে এই অবজেক্টটি তার রাষ্ট্র বা এর প্রয়োগের বিশদ সম্পর্কে তথ্য ফাঁস করবে।

এবং আপনি চাইবেন না যে বি এর প্রয়োগের বিবরণ সম্পর্কে সিটি অবজেক্টটি জানতে হবে এটি সি অবজেক্টের দৃষ্টিকোণ থেকে একটি অজেক্টের উপর একটি অযাচিত নির্ভরতা।

সুতরাং আপনি নিজেকে জিজ্ঞাসা করতে চাইতে পারেন যে সি, এ জেনেও তিনি এলওডির থেকে স্বতন্ত্রভাবে যে কাজটি করতে হবে তা খুব বেশি জানেন না।

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

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


0

ক্লাসগুলি ছাড়াও যা নির্দিষ্টভাবে কারখানার এবং বিল্ডার শ্রেণীর মতো বস্তুগুলি ফেরত দেওয়ার জন্য নিয়োগ করা হয়েছিল - কোনও পদ্ধতির কোনও জিনিস ফেরত দেওয়া কি ঠিক আছে?

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


উদাহরণটি অন্তর্নিহিত b.getA().doSomething()এবংx.doSomethingElse(b.getA())
ব্যবহারকারী 2180613

A a = b.getA(); a.DoSomething();- এক বিন্দু ফিরে।
রবার্ট হার্ভে

2
@ ইউজার 2180613 - আপনি যদি এটি সম্পর্কে জানতে চেয়েছিলেন b.getA().doSomething()এবং x.doSomethingElse(b.getA())আপনার এ সম্পর্কে স্পষ্টভাবে জিজ্ঞাসা করা উচিত ছিল। এটি যেমন দাঁড়িয়েছে, আপনার প্রশ্নটি প্রায় উপস্থিত রয়েছে this.b.getA()
ডেভিড হামেন

1
হিসাবে Aএকজন সদস্য নয় C, এ সৃষ্টি Cএবং প্রদান করেননি C, মনে হয় যে ব্যবহার Aমধ্যে C(যাই হোক না কেন পদ্ধতিতে) লোদ লঙ্ঘন করে। বিন্দু গণনা লোডের মতো নয়, এটি কেবল একটি চিত্রকর সরঞ্জাম। Driver().getCar().getSteeringWheel().getFrontWheels().toRight()পৃথক স্টেটমেন্টে রূপান্তর করা সম্ভব যে প্রতিটিতে একটি করে বিন্দু রয়েছে তবে লোডের লঙ্ঘন এখনও আছে। আমি এই ফোরাম অনেক পোস্ট পড়ি যে করণ ক্রিয়া বস্তু কার্যকরী প্রকৃত আচরণ অর্থাত অর্পণ করা উচিত tell don't ask। প্রত্যাবর্তন মানগুলি এর সাথে দ্বন্দ্ব বলে মনে হচ্ছে।
ব্যবহারকারী 2180613

1
আমি মনে করি এটি সত্য তবে এটি প্রশ্নের উত্তর দেয় না।
ব্যবহারকারী 2180613

0

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

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

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