নামযুক্ত যুক্তিগুলি কি বিল্ডার প্যাটার্নটি প্রতিস্থাপন করে?


20

নামযুক্ত এবং namedচ্ছিক আর্গুমেন্টকে সমর্থন করে এমন কোনও ভাষা ব্যবহার করার সময়, বিল্ডার প্যাটার্নটির আর ব্যবহারিক ব্যবহার নেই?

নির্মাতা:

new Builder(requiredA, requiredB).setOptionalA("optional").Build();

/চ্ছিক / নামযুক্ত যুক্তি:

new Object(requiredA, requiredB, optionalA: "optional");

3
আপনি কীভাবে 20 টি ?চ্ছিক যুক্তি পরিচালনা করবেন? বিল্ডার বড় হওয়া অবধি সমস্যার সমাধান করার দরকার নেই। আপনি এখানে বর্ণনা করেছেন এমন পয়েন্টে আপনার কাছে দু'জন কনস্ট্রাক্টর রয়েছে (এবং আমি কোনও ছোট্ট সমস্যার জন্যই কোনও বিল্ডার তৈরি করব না)।

1
এমনকি বিকল্প argu তরল ইনরফেস এবং বিল্ডারের ক্ষেত্রে একই: 3 টিরও বেশি যে কোনও কিছু মান বস্তুর দ্বারা প্রতিস্থাপিত হবে।
থমাস জাঙ্ক

উত্তর:


21

বিল্ডার সর্বাধিক দরকারী যখন আপনার অবজেক্টটির প্রচুর পরিমাণে আর্গুমেন্ট / নির্ভরতা প্রয়োজন কার্যকর হয় বা আপনি অবজেক্টটি তৈরির বিভিন্ন উপায়ের অনুমতি দিতে চান।

আমার মাথার শীর্ষে, আমি কল্পনা করতে পারি যে কেউ এই জাতীয় 3D খেলায় "বিল্ড" করতে পারে:

// Just ignore the fact that this hypothetical god class is coupled to everything ever
new ObjectBuilder(x, y, z).importBlenderMesh("./meshes/foo")
                          .syncWithOtherPlayers(serverIP)
                          .compileShaders("./shaders/foo.vert", "./shaders/foo.frag")
                          .makeDestructibleRigidBody(health, weight)
                          ...

আমি যুক্তি দিয়ে বলব যে এই উদাহরণটি আমি যে বিল্ডার পদ্ধতিগুলি তৈরি করেছি তার সাথে কেবলমাত্র তৈরি করা হয়েছে itচ্ছিক পরামিতিগুলির তুলনায় এটি আরও পঠনযোগ্য:

new Object(x, y, z, meshType: MESH.BLENDER,
                    meshPath: "./meshes/foo",
                    serverToSyncWith: serverIP,
                    vertexShader: "./shaders/foo.vert",
                    physicsType: PHYSICS_ENGINE.RIGID_DESTRUCTIBLE,
                    health: health,
                    weight: weight)
                    ...

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


অবশ্যই, যদি আপনার অবজেক্টটি কেবল এক থেকে পাঁচটি আর্গুমেন্ট তৈরি করতে লাগে, তবে আপনার নাম / alচ্ছিক পরামিতিগুলি রেখেছেন বা না থাকায় বিল্ডার প্যাটার্নটিকে জড়িত করার দরকার নেই।


আমি আপনার যুক্তি কিনতে না। যদি বিল্ডার পদ্ধতির নামগুলি এত দুর্দান্ত হয় তবে আপনি সেগুলি প্যারামিটার নামের জন্যও ব্যবহার করতে পারেন। যদি প্যারামিটারগুলি নিবিড়ভাবে সম্পর্কিত হয় তবে এগুলি একটি ছোট অবজেক্ট কনস্ট্রাক্টরে রাখুন।
user949300

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

1
theচ্ছিক প্যারামিটারগুলির মধ্যে একটি না হলে (দেহ: নতুন ধ্বংসাত্মকরেগডবডি (স্বাস্থ্য, ওজন), ...)
ওয়েল্যান্ড ইয়ুতানি

@Jules। ওয়েইল্যান্ড যা বলেছিল - ওজন ও উচ্চতার জন্য কিছুটা নামযুক্ত কনস্ট্রাক্টর তৈরি করুন।
ব্যবহারকারী949300

8

Ixrec যা বলেছিল তা ছাড়াও, কনস্ট্রাক্টরগুলি বা প্যারামিটারের নামকরণ পদ্ধতি আপনাকে নিজের অবজেক্টটিকে কোনও নির্মাণ-করা অবস্থায় থাকতে দেয় না যেখানে এটি নির্মাণের আগে এটি এখনও সংশোধন করা যেতে পারে। এটি বিল্ডারের সৌন্দর্য, যেখানে আপনি এর নির্মাণের অংশগুলি পুরোপুরি বিভিন্ন পদ্ধতি বা ক্লাসে অর্পণ করতে পারেন:

var myThingBuilder = new ThingBuilder("table");
myThingBuilder.setAttribute(Attributes.Legs, 4);

inventoryManager.setPrices(myThingBuilder);

// inventory manager
var availableCheapestMaterial = getMaterial();
myThingBuilder.setMaterial(availableCheapestMaterial);

মূলত, আপনি আপনার বিল্ডারকে চূড়ান্ত বস্তুটি তৈরি করতে প্রস্তুত না হওয়া অবধি আপনার সিস্টেমের চারপাশে ছুঁড়ে ফেলতে সক্ষম হবেন, আপনাকে আপনার বিল্ডার-গ্রাহকের যে পরিমাণ জ্ঞানের প্রয়োজন তা হ্রাস করতে দেয়।


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

@ user949300 বিল্ডারকে সিস্টেম জুড়ে ভ্রমণ না করে কেমন হবে তা ভেবে দেখুন । আপনাকে একটি বিশাল ফ্যান-আউট ফ্যাক্টর সহ একটি ক্লাস করতে বাধ্য করা হবে এবং এটি থিংটি তৈরির জন্য কেবল প্রয়োজনীয়। (অবশ্যই, আপনার শ্রেণীটি সমস্ত জ্ঞানকে কেন্দ্রীভূত করে না বলে ধরে নিচ্ছি, এটিই আমরা প্রথমে এড়াতে চেয়েছিলাম।) এখন, এই শ্রেণীর যদি অন্য কোনও দায়িত্ব থাকে তবে আপনি SOLID তে এসকে ভেঙে একটি বিশাল শ্রেণি তৈরি করছেন you're । যদি এটিই কেবল দায়বদ্ধ হয় তবে আপনি নিজেকে থিংবিল্ডার বানাচ্ছেন।
আলফা

1

এটি নির্মাতার সাথে আপনি কী করছেন তার উপর নির্ভর করে।

আপনি যদি বিল্ডারকে কেবলমাত্র (এবং পরিবর্তিত) অবজেক্ট বৈশিষ্ট্য এবং (ডিফার) অবজেক্ট তৈরি করতে ব্যবহার করছেন তবে এটি নামযুক্ত প্যারামগুলি দিয়ে প্রতিস্থাপন করা যেতে পারে।

বিল্ডারকে প্রতিস্থাপন করা আপনার কাছে পঠনযোগ্যতা / ব্যবহারের ট্রেডঅফ থাকতে পারে যা @ ইমরেক্স মেন্টোনড (বা এটি নাও থাকতে পারে, এটি আপনি বিল্ডারের সাথে কী করছেন তার উপর নির্ভর করে)।

তবে, যদি আপনার নির্মাতা কেবল সম্পত্তি রাখার চেয়ে আরও বেশি কিছু করেন এবং প্রতিটি নির্মাণ ধাপ যুক্তিযুক্ত থাকে, তবে এটি প্রতিস্থাপন করা যাবে না।

মকবিল্ডার একটি উদাহরণ যেখানে এটি নামী প্যারামগুলির সাথে প্রতিস্থাপন করা যায় না। পৃষ্ঠা থেকে:

সৃষ্ট পদক্ষেপগুলিতে যুক্তিযুক্ত নামযুক্ত প্যারামগুলি প্রতিস্থাপন করা যায় না


-5

অপরিবর্তনীয় বস্তুর সাথে কাজ করার সময় বিল্ডার প্যাটার্নটি প্রয়োজনীয়। অপরিবর্তনীয় বস্তুগুলির সাথে কাজ করার অনেকগুলি সুবিধা রয়েছে, বিশেষত আপনার প্রোগ্রামটি সমবর্তী পরিবেশে আরও শক্তিশালীভাবে কার্যকর করা (যেমন থ্রেড) তৈরি করা


3
হ্যাঁ, নির্মাতারা জটিল অপরিবর্তনীয় বস্তুগুলির সাথে কাজ করার জন্য দুর্দান্ত (বা এমনকি পরিবর্তনযোগ্যগুলিও - আপনাকে অবশ্যই নিশ্চিত করতে হবে যে অবজেক্টটি ব্যবহারের আগে এটি সামঞ্জস্যপূর্ণ অবস্থায় রয়েছে)। তাই বলা হয়, new Integer(42), new BigDecimal("42.000")এবং new String("foobar")immutables যে ... ভাল, একটি রচয়িতা এই দৃষ্টান্ত জন্য অযথা জটিল হবে সব কনস্ট্রাকটর। সুতরাং নির্মাতারা অপরিবর্তনীয় সাথে কাজ করার জন্য অপরিহার্য নয় যখন কনস্ট্রাক্টররা ঠিক পাশাপাশি কাজ করতে পারে।

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

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