এটি বেশ সহজ, আসলে:
কোনও কনস্ট্রাক্টর রাখার পরিবর্তে যা আপনার সেটআপ করে,
// c-family pseudo-code
public class Thing {
public Thing (a, b, c, d) { this.x = a; this.y = b; /* ... */ }
}
... আপনার কনস্ট্রাক্টরকে কিছু কম বা কিছু করতে দিন এবং একটি পদ্ধতি নামক শব্দটি লিখুন .init
বা .initialize
যা আপনার নির্মাতা সাধারণত যা করতে পারে তা করে।
public class Thing {
public Thing () {}
public void initialize (a, b, c, d) {
this.x = a; /*...*/
}
}
সুতরাং এখন পরিবর্তে ঠিক মত যেতে:
Thing thing = new Thing(1, 2, 3, 4);
আপনি যেতে পারেন:
Thing thing = new Thing();
thing.doSomething();
thing.bind_events(evt_1, evt_2);
thing.initialize(1, 2, 3, 4);
সেখানে সুবিধাটি হ'ল আপনি এখন আপনার সিস্টেমে নির্ভরতা-ইনজেকশন / ইনভার্শন-অফ-নিয়ন্ত্রণ আরও সহজে ব্যবহার করতে পারেন easily
কথার পরিবর্তে
public class Soldier {
private Weapon weapon;
public Soldier (name, x, y) {
this.weapon = new Weapon();
}
}
আপনি সৈনিক নির্মাণ করতে পারেন, তাকে একটি সরঞ্জাম সম্পর্কিত পদ্ধতি, যেখানে আপনি দিতে হাতে তাকে একটি অস্ত্র, এবং তারপর কন্সট্রাকটর ফাংশন বাকি সব কল।
সুতরাং এখন, শত্রুদের সাবক্লাসিংয়ের পরিবর্তে যেখানে একজন সৈনিকের কাছে একটি পিস্তল রয়েছে এবং অন্য একজনের কাছে একটি রাইফেল রয়েছে এবং অন্যটির কাছে একটি শটগান রয়েছে, এবং এটিই কেবল পার্থক্য, আপনি কেবল বলতে পারেন:
Soldier soldier1 = new Soldier(),
soldier2 = new Soldier(),
soldier3 = new Soldier();
soldier1.equip(new Pistol());
soldier2.equip(new Rifle());
soldier3.equip(new Shotgun());
soldier1.initialize("Bob", 32, 48);
soldier2.initialize("Doug", 57, 200);
soldier3.initialize("Mike", 92, 30);
ধ্বংস একই একই চুক্তি। আপনার যদি বিশেষ চাহিদা থাকে (ইভেন্ট শ্রোতাদের সরিয়ে দেওয়া, অ্যারেগুলি থেকে উদাহরণগুলি সরিয়ে / আপনি যে কোনও কাঠামোর সাথে কাজ করছেন ইত্যাদি ইত্যাদি), তবে আপনি সেগুলি ম্যানুয়ালি কল করতে পারেন, যাতে আপনি ঠিক কখন এবং কোথায় প্রোগ্রামটি ঘটছে তা জানতে পারবেন।
সম্পাদনা
ক্রিওটন যেমন উল্লেখ করেছেন, নীচে, এটি মূল পোস্টের "কীভাবে" জবাব দেয় , কিন্তু সত্যই "কেন" এর একটি ভাল কাজ করে না।
আপনি সম্ভবত উপরের উত্তরে দেখতে পাচ্ছেন, এর মধ্যে অনেক পার্থক্য নাও থাকতে পারে:
var myObj = new Object();
myObj.setPrecondition(1);
myObj.setOtherPrecondition(2);
myObj.init();
এবং লেখার
var myObj = new Object(1,2);
যখন কেবল একটি বৃহত্তর কনস্ট্রাক্টর ফাংশন রয়েছে।
15 বা 20 প্রি-কন্ডিশনযুক্ত অবজেক্টগুলির জন্য একটি যুক্তি রয়েছে, যা কোনও নির্মাণকারীকে খুব কাজ করা খুব কঠিন করে তোলে এবং ইন্টারফেসের মধ্যে সেই জিনিসগুলি টেনে এনে জিনিসগুলি দেখতে এবং মনে রাখা সহজ করে তোলে , যাতে আপনি দেখতে পারেন যে ইনস্ট্যান্টেশনটি কীভাবে কাজ করে, এক স্তর উচ্চ।
বস্তুর -চ্ছিক-কনফিগারেশন এটিকে প্রাকৃতিক বর্ধন; objectচ্ছিকভাবে ইন্টারফেসে মান সেট করা, অবজেক্টটি রান করার আগে।
জেএসের এই ধারণার জন্য কিছু দুর্দান্ত শর্টকাট রয়েছে, যা দৃ stronger়-টাইপযুক্ত সি-জাতীয় ভাষায় কেবল স্থানের বাইরে বলে মনে হয়।
এটি বলেছিল, সম্ভাবনাগুলি হ'ল, যদি আপনি আপনার কনস্ট্রাক্টরের দীর্ঘকাল ধরে একটি যুক্তি তালিকার সাথে কাজ করে থাকেন তবে আপনার অবজেক্টটি খুব বড় এবং যেমনটি হয় তেমন করে। আবার এটি ব্যক্তিগত-পছন্দের জিনিস, এবং দূর-দূরান্তে ব্যতিক্রম রয়েছে, তবে আপনি যদি 20 টি জিনিস কোনও বস্তুর মধ্যে দিয়ে যাচ্ছেন তবে সম্ভাব্য ভাল যে আপনি ছোট বস্তু তৈরি করে সেই বস্তুকে কম করে দেওয়ার উপায় খুঁজে পেতে পারেন ।
আরও প্রাসঙ্গিক কারণ এবং যেটি বহুলভাবে প্রযোজ্য তা হ'ল কোনও সামগ্রীর সূচনাটি বর্তমানে অ্যাসিনক্রোনাস ডেটার উপর নির্ভর করে যা আপনার কাছে নেই।
আপনি জানেন যে আপনার অবজেক্টটির প্রয়োজন, সুতরাং আপনি এটি যে কোনও উপায়ে তৈরি করতে যাচ্ছেন তবে এটি সঠিকভাবে কাজ করার জন্য এটির সার্ভার থেকে বা অন্য ফাইল থেকে এখন এটি লোড হওয়া দরকার data
আবার, আপনি প্রয়োজনীয় উপাত্ত একটি বৃহত্তর উদ্যোগে পাস করছেন, বা একটি ইন্টারফেস তৈরি করা ধারণাটির পক্ষে আসলেই গুরুত্বপূর্ণ নয়, যতটা গুরুত্বপূর্ণ এটি আপনার অবজেক্টের ইন্টারফেস এবং আপনার সিস্টেমের ডিজাইনের পক্ষে গুরুত্বপূর্ণ ...
তবে অবজেক্টটি তৈরির ক্ষেত্রে আপনি এমন কিছু করতে পারেন:
var obj_w_async_dependencies = new Object();
async_loader.load(obj_w_async_dependencies.async_data, obj_w_async_dependencies);
async_loader
ফাইলের নাম, বা কোনও সংস্থার নাম বা যা-ই হোক না কেন, সেই উত্সটি লোড করুন - সম্ভবত এটি শব্দ ফাইলগুলি, বা চিত্রের ডেটা লোড করে, বা এটি সংরক্ষণ করা অক্ষরের পরিসংখ্যানগুলি লোড করে ...
... এবং তারপরে এটি সেই ডেটা ফিরবে obj_w_async_dependencies.init(result);
।
এই ধরণের ডায়নামিক প্রায়শই ওয়েব-অ্যাপ্লিকেশনগুলিতে পাওয়া যায়।
অগত্যা কোনও উচ্চ স্তরের অ্যাপ্লিকেশনগুলির জন্য নির্মাণে নয়: উদাহরণস্বরূপ, গ্যালারীগুলি এখনই লোড এবং প্রারম্ভিক হতে পারে এবং ফটোগুলি সেগুলি প্রবাহিত করার সাথে সাথে প্রদর্শন করতে পারে - এটি আসলে একটি অ্যাসিঙ্ক-ইনিশিয়ালাইজেশন নয়, তবে যেখানে এটি আরও ঘন ঘন দেখা যায় তা হবে জাভাস্ক্রিপ্ট লাইব্রেরিতে।
একটি মডিউল অন্যটির উপর নির্ভর করতে পারে, এবং নির্ভর করে লোডিং সম্পূর্ণ না হওয়া পর্যন্ত সেই মডিউলটির সূচনা স্থগিত করা যেতে পারে।
এর গেম-নির্দিষ্ট দৃষ্টান্তগুলির ক্ষেত্রে, একটি আসল Game
শ্রেণি বিবেচনা করুন ।
কেন আমরা কল করতে পারি না .start
বা .run
কনস্ট্রাক্টরে?
রিসোর্সগুলি লোড করা দরকার - বাকি সমস্ত কিছু সংজ্ঞায়িত করা হয়েছে এবং যাওয়া ভাল, তবে আমরা যদি ডেটাবেস-সংযোগ ছাড়াই, বা টেক্সচার, মডেল বা শব্দ বা স্তর ছাড়াই গেমটি চালানোর চেষ্টা করি, তবে এটি হবে না একটি বিশেষ আকর্ষণীয় খেলা ...
... সুতরাং, তবে আমরা একটি সাধারণের সাথে Game
যা দেখি তার মধ্যে পার্থক্য , কেবলমাত্র আমরা এর "এগিয়ে চলুন" পদ্ধতিটিকে এমন একটি নাম দিই যা .init
(বা বিপরীতভাবে, পৃথক লোডিংয়ের জন্য আরম্ভকে আরও আলাদা করে ভেঙে দেওয়া, লোড করা জিনিসগুলি সেট আপ করা এবং যখন সবকিছু সেট আপ হয়ে যায় তখন প্রোগ্রামটি চালানো)।