return new(className) vs return this

এপিআই প্রজেক্টটা করার সময়ে একটা ক্লাস বানাতে হলো AccessValidation নামে। এই ক্লাসটা বিভিন্ন ক্লাস তার প্যারামিটারগুলো ভেরিফাই করতে ব্যবহার করছে। এখন ঝামেলা হলো ভ্যালিডেশন করার ব্যাপারে একেক ক্লাসের রিকোয়ারমেন্ট একেকরকম, ফলে AccessValidation ক্লাসটা চেইনেবল হতে হবে যাতে একটার পর একটা ভ্যালিডেশন মেথড ডট (.) দিয়ে কল করা যায়।

চেইনেবল করতে গেলে অপশন দুইটা: মেথডের শেষে new classname(); দেয়া অথবা return this দেয়া। new classname(); দিলে সব অবজেক্ট immutable হবে, মানে কোন অবজেক্টই ডিলিট হবে কোন কলের পরে, সব মেথড কল আলাদা আলাদা object instance নিয়ে থাকবে। অন্যদিকে return this; দিলে মেথড কলগুলো একটাই object instance এর ভিতর থাকবে।

সুতরাং নিচের কোড ও সেটার ফ্রাগমেন্টের অবজেক্ট কাউন্ট:

class A{
void doSomething() { return this; }
}
 
class B{
void doSomething() { return new B(); }
}
 
new A().method().method();
//object count in memory= 1, all doSomething method call are part of the object instance from new A() call;
 
new B().method().method();
//object count in memory= 3, each doSomething method have got separate object instance;

ব্যাপারটা মোটামুটি এই। LINQ ব্যবহার করে class-B এর সিস্টেম কারণ এখানে সব অবজেক্ট immutable. অন্যদিকে jquery ব্যবহার করে class-A  এর সিস্টেম যাতে করে একটা সিলেক্টরে (যেমন:$("#idOfTheDiv");) কিছু সিলেক্ট করে এরপরে doSomething মেথড কল করেও চেইনিং বজায় রাখা যায় সিলেক্টর দিয়ে সিলেক্ট করা অবজেক্টগুলোর উপর। Java/C# এর string concat মেথডগুলিও LINQ সিস্টেম ফলো করে কারণ এখানেও কোন অবজেক্ট মডিফাই হয়না, সবসময় নতুন অবজেক্ট তৈরী হয় ও পুরাতন (concat করার জন্যে ব্যবহৃত অবজেক্ট, যেটা concat হয়ে গেলে আর দরকার নাই) অবজেক্টগুলো অটোমেটিক্যালি গারবেজ কালেক্টরে চলে যায়.

লোকাল কপি/immutable অবজেক্টের কারণে কিরকম পরিবর্তন হতে পারে আউটপুটে তার একটা উদাহরন: http://stackoverflow.com/a/7190237/385205

Leave a Reply

Your email address will not be published. Required fields are marked *