কোনও শ্রেণীর কোনও পদ্ধতি যখন নিজের পরিবর্তন করার পরে একই উদাহরণ ফিরে আসে?


9

আমি একটি বর্গ তিনটি পদ্ধতির যে আছে A(), B()এবং C()। এই পদ্ধতিগুলি নিজস্ব উদাহরণটি পরিবর্তন করে।

যখন উদাহরণগুলি পৃথক অনুলিপি (ঠিক তেমন Clone()) হয় তখন পদ্ধতিগুলিতে কোনও উদাহরণ ফিরিয়ে দিতে হয় , আমি পদ্ধতিতে একই উদাহরণটি সংশোধন করার সময় এবং অন্য কোনও মান ফেরত না দেওয়ার সময় ফিরে আসার জন্য একটি অবাধ পছন্দ voidবা একই উদাহরণ ( return this;) পেয়েছিলাম ।

একই পরিবর্তিত উদাহরণটি ফেরত দেওয়ার সিদ্ধান্ত নেওয়ার সময় আমি ঝরঝরে পদ্ধতিতে চেইনগুলি করতে পারি obj.A().B().C();

এটি কি একমাত্র কারণ হবে?

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

উত্তর:


7

চেইনিং কখন ব্যবহার করবেন

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

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

শৃঙ্খল কি?

Fooনিম্নলিখিত দুটি পদ্ধতি নামের একটি শ্রেণি দেওয়া উভয় শৃঙ্খলযোগ্য।

function what() { return this; }
function when() { return new Foo(this); }

বর্তমানের উদাহরণগুলির মধ্যে একটি হল একটি উল্লেখ এবং এটি একটি নতুন উদাহরণ তৈরি করে যে এগুলি চেইনযোগ্য পদ্ধতি are

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

class B { function When() { return true; } };
class A { function What() { return new B(); } };

var a = new A();
var x = a.What().When();

thisউপরোক্ত উদাহরণটির কোনও উল্লেখ নেই । কোডটি a.What().When()একটি শৃঙ্খলার উদাহরণ। মজার বিষয় হ'ল শ্রেণীর ধরণটি Bকখনই কোনও ভেরিয়েবলের জন্য বরাদ্দ করা হয় না।

কোনও পদ্ধতি শৃঙ্খলিত হয় যখন তার ফেরতের মানটি প্রকাশের পরবর্তী উপাদান হিসাবে ব্যবহৃত হয়।

এখানে আরও কিছু উদাহরণ দেওয়া হল

 // return value never assigned.
 myFile.Open("something.txt").Write("stuff").Close();

// two chains used in expression
int x = a.X().Y() * b.X().Y();

// a chain that creates new strings
string name = str.Substring(1,10).Trim().ToUpperCase();

কখন ব্যবহার করবেন thisএবংnew(this)

বেশিরভাগ ভাষায় স্ট্রিং অপরিবর্তনীয়। সুতরাং চেইন পদ্ধতিতে কলগুলি সর্বদা নতুন স্ট্রিং তৈরি হওয়ার ফল দেয়। যেখানে স্ট্রিংবিল্ডারের মতো কোনও বস্তু পরিবর্তন করা যেতে পারে।

ধারাবাহিকতা সেরা অনুশীলন।

যদি আপনার কাছে এমন কোনও পদ্ধতি রয়েছে যা কোনও অবজেক্টের স্থিতি পরিবর্তন করে এবং ফিরে আসে this, তবে নতুন পদ্ধতিগুলিতে ফিরে আসে এমন পদ্ধতিগুলিতে মেশাবেন না। পরিবর্তে, একটি নির্দিষ্ট পদ্ধতি তৈরি করুন Clone()যা এটি স্পষ্টভাবে এটি করবে create

 var x  = a.Foo().Boo().Clone().Foo();

এটি ভিতরে যা চলছে তা অনেকটা পরিষ্কার a

স্টেপ আউটসাইড অ্যান্ড ব্যাক ট্রিক

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

অস্থায়ী শ্রেণীটি কেবলমাত্র মূল শ্রেণীর জন্য বিশেষ বৈশিষ্ট্য সরবরাহ করার জন্য বিদ্যমান, তবে কেবল বিশেষ শর্তে।

প্রায়শই এমন সময় আসে যখন একটি শৃঙ্খলে রাষ্ট্র পরিবর্তন করার প্রয়োজন হয় তবে শ্রেণি এই Aসমস্ত সম্ভাব্য রাজ্যের প্রতিনিধিত্ব করতে পারে না । সুতরাং একটি শৃঙ্খল সময় একটি নতুন শ্রেণী চালু যে একটি রেফারেন্স ফিরে রয়েছে A। এটি প্রোগ্রামারকে একটি রাজ্যে প্রবেশ করতে এবং ফিরে যেতে সহায়তা করে A

এখানে আমার উদাহরণ, বিশেষ রাষ্ট্র হিসাবে পরিচিত করা যাক B

class A {
    function Foo() { return this; }
    function Boo() { return this; }
    function Change() return new B(this); }
}

class B {
    var _a;
    function (A) { _a = A; }
    function What() { return this; }
    function When() { return this; }
    function End() { return _a; }
}

var a = new A();
a.Foo().Change().What().When().End().Boo();

এখন এটি একটি খুব সাধারণ উদাহরণ। আপনি যদি আরও নিয়ন্ত্রণ Bরাখতে চান তবে তার নতুন Aপদ্ধতিতে ফিরে আসতে পারে যার বিভিন্ন পদ্ধতি রয়েছে।


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

আমি আপনাকে যা বলেছি তা ভুগছি আমি বলেছিলাম যে কোনও ভাষার জন্য যখন ইন্টেলিজেন্স সাধারণ হয় তখন এটি বেশি জনপ্রিয়। আমি কখনও বলিনি যে এটি বৈশিষ্ট্যের উপর নির্ভরশীল।
আয়তাকার

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

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

3

এই পদ্ধতিগুলি নিজস্ব উদাহরণটি পরিবর্তন করে।

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

এটি কি একমাত্র কারণ হবে?

নির্দিষ্ট আচরণের জন্য (মনে করুন x++) আশা করা যায় যে এটি পরিবর্তনশীল পরিবর্তন করেও অপারেশন ফলাফলটি ফিরিয়ে দেয়। তবে এটি কেবল নিজেরাই এটি করার একমাত্র কারণ।

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

এটা নির্ভর করে.

যে ভাষাগুলিতে অনুলিপি / নতুন এবং ফিরে আসা সাধারণ (সি # লিনকুই এবং স্ট্রিং) তখন একই রেফারেন্সটি ফিরিয়ে দেওয়া বিভ্রান্তিকর হবে। যে ভাষাগুলিতে সংশোধন করা এবং ফিরে আসা সাধারণ (কিছু সি ++ গ্রন্থাগার) তখন অনুলিপিটি বিভ্রান্তিকর হবে।

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


আপনার উত্তরের জন্য ধন্যবাদ। আমি মূলত .NET ফ্রেমওয়ার্কের সাথে কাজ করছি এবং আপনার উত্তরে এটি অ-অহংকারী জিনিসগুলিতে পূর্ণ। যদিও LINQ পদ্ধতি ভালো জিনিস মত অপারেশন ইত্যাদি জিনিষ সংযোজন পর মূল একটি নতুন অনুলিপি আসতে Clear()বা Add()কোনো সংগ্রহ ধরনের একই উদাহরণস্বরূপ এবং বিনিময়ে পরিবর্তন করতে হবে void। উভয় ক্ষেত্রেই আপনি বলেন এটি বিভ্রান্তিকর হবে ...
মার্টিন ব্রাউন

@ মডিক্স - অপারেশন সংযোজন করার সময় লিনকউ একটি অনুলিপি ফেরায় না
টেলাস্টিন

আমি কেন obj = myCollection.Where(x => x.MyProperty > 0).OrderBy(x => x.MyProperty);তখন করতে পারি ? Where()একটি নতুন সংগ্রহ অবজেক্ট প্রদান করে। OrderBy()এমনকি একটি পৃথক সংগ্রহ অবজেক্ট প্রদান করে, কারণ সামগ্রীটি অর্ডার করা হয়েছে।
মার্টিন ব্রাউন

1
@modix - তারা নতুন যে বস্তু বাস্তবায়নে আসতে IEnumerable, কিন্তু স্পষ্ট করা, তারা কপি হয় না, এবং তারা না সংগ্রহগুলি (ছাড়া হয় ToList, ToArrayইত্যাদি)।
টেলাস্টিন

এটি ঠিক, এগুলি অনুলিপি নয়, তদুপরি তারা আসলে নতুন বস্তু। সংগ্রহটি বলার মাধ্যমে আমি সেই অবজেক্টগুলিকে উল্লেখ করছি যা আপনি গণনা করতে পারেন (যে বিষয়গুলি কোনও ধরণের অ্যারেতে একাধিক বস্তু ধারণ করে), উত্তরাধিকার সূত্রে প্রাপ্ত বর্গগুলিতে নয় ICollection। আমার খারাপ।
মার্টিন ব্রাউন 14

0

(আমি আপনার প্রোগ্রামিং-ভাষা হিসাবে সি ++ ধরেছি)

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

do_something(
      CPerson('name').age(24).height(160).weight(70)
      );

তুলনা করা

{
   CPerson person('name');
   person.set_age(24);
   person.set_height(160);
   person.set_weight(70);
   do_something(person);
}

পরিবর্তিত উদাহরণের কোনও রেফারেন্স ফিরিয়ে দেওয়া ঠিক আছে কিনা তা রেজিস্ট্রেশন করে আমি হ্যাঁ বলব এবং আপনাকে উদাহরণস্বরূপ স্ট্রিম অপারেটরগুলিতে >> >> 'এবং' << '( http://www.cprogramming.com/tutorial/) উল্লেখ করব অপারেটর_ওভারলোডিং এইচটিএমএল )


1
আপনি ভুল ধরেছেন, এটি সি #। তবে আমি চাই আমার প্রশ্নটি আরও সাধারণ হয়ে উঠুক।
মার্টিন ব্রাউন

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

0

আপনি রিটার্ন পরিবর্তনের পরিবর্তে কপি রিটার্নের সাথে পদ্ধতিতে শৃঙ্খলাবদ্ধ জিনিসটিও করতে পারেন।

একটি ভাল সি # উদাহরণ হ'ল প্রতিস্থাপন (ক, খ) যা এটি চাওয়া স্ট্রিং পরিবর্তন করে না বরং পরিবর্তে একটি নতুন স্ট্রিং ফিরে আসে যা আপনাকে আনন্দের সাথে দূরে সরিয়ে রাখতে দেয়।


হ্যা আমি জানি. তবে আমি এই কেসটি উল্লেখ করতে চাইনি, কারণ যখন আমি নিজের দৃষ্টান্তটি যেভাবেই সম্পাদনা করতে চাই না তখন আমাকে এই কেসটি ব্যবহার করতে হয়। যাইহোক, এটি নির্দেশ করার জন্য ধন্যবাদ।
মার্টিন ব্রাউন 14 ই

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