জাভাতে অনেকগুলি পরামিতি সহ নির্মাণকারীদের পরিচালনা করা


105

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

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

বর্ণ অনুসারে আর্গুমেন্টগুলি সাজানোর একটি কনভেনশন কাজ করে না কারণ কোনও প্রকার যদি রিফ্যাক্টর করা হয় (আপনি যে বৃত্তটি আর্গুমেন্ট 2 এর জন্য দিয়ে যাচ্ছিলেন সেটি এখন একটি আকার) এটি হঠাৎ বিন্যস্ত হতে পারে।

এই প্রশ্নটি সুনির্দিষ্ট হতে পারে এবং "যদি এটি আপনার সমস্যা হয় তবে আপনি এটি একটি নকশা স্তরে ভুল করছেন" সমালোচনা, তবে আমি কেবল কোনও দৃষ্টিকোণ খুঁজছি।

উত্তর:


264

বিল্ডার ডিজাইন প্যাটার্নটি সহায়তা করতে পারে। নিম্নলিখিত উদাহরণ বিবেচনা করুন

public class StudentBuilder
{
    private String _name;
    private int _age = 14;      // this has a default
    private String _motto = ""; // most students don't have one

    public StudentBuilder() { }

    public Student buildStudent()
    {
        return new Student(_name, _age, _motto);
    }

    public StudentBuilder name(String _name)
    {
        this._name = _name;
        return this;
    }

    public StudentBuilder age(int _age)
    {
        this._age = _age;
        return this;
    }

    public StudentBuilder motto(String _motto)
    {
        this._motto = _motto;
        return this;
    }
}

এটি আমাদের মতো কোড লিখতে দেয়

Student s1 = new StudentBuilder().name("Eli").buildStudent();
Student s2 = new StudentBuilder()
                 .name("Spicoli")
                 .age(16)
                 .motto("Aloha, Mr Hand")
                 .buildStudent();

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


10
অবশ্যই স্থিতিশীল আমদানির সাথে আপনাকে কখনও "এই" বিল্ডারদের "দেখতে" হবে না। উদাহরণস্বরূপ, আপনার স্ট্যাটিক পদ্ধতির নাম (স্ট্রিং নেম) থাকতে পারে যা একজন বিল্ডার এবং শিক্ষার্থী (স্টুডেন্টবিল্ডার) দেয় যা একজন শিক্ষার্থীকে রিটার্ন দেয়। সুতরাং শিক্ষার্থী (নাম ("জো")। বয়স (15) .মোটো ("আমি নিজেকে ভিজিয়েছি"));
অক্সবো_লাক্স 21:48

2
@ অক্সবো_লাকস: আপনার উদাহরণে, কোন শ্রেণীর স্ট্যাটিক পদ্ধতির নাম (স্ট্রিং নাম) রয়েছে?
ব্যবহারকারী 443854

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

1
@WVrock: এটি আপনার বাস্তবায়নের উপর নির্ভর করে। আমার উত্তরে আমি যেমন বলছি, ছাত্র শ্রেণীর সাথে এটি করার ফলে নিজেই ক্লাসটি অর্ধ-প্রাথমিক অবস্থায় ফেলে যেতে পারে, উদাহরণস্বরূপ যদি আপনার প্রয়োজনীয় ক্ষেত্র রয়েছে যা এখনও শুরু হয়নি।
এলি কোর্টরাইট

@ এলিকোর্ট রাইটার্ট আমার ধারণা এটি পছন্দ / কোড ডিজাইন সম্পর্কে। কনস্ট্রাক্টর পরিবর্তে ব্যতিক্রম ছুঁড়ে ফেলতে আমি buildStudent()পদ্ধতিটিকে ব্যতিক্রম ছুঁড়ে ফেলা করেছি।
WVrock

24

আপনি কি কোনও বস্তুর অভ্যন্তরে সম্পর্কিত পরামিতিগুলি encapsulate করতে পারেন?

উদাহরণস্বরূপ, যদি পরামিতিগুলি পছন্দ হয়


MyClass(String house, String street, String town, String postcode, String country, int foo, double bar) {
  super(String house, String street, String town, String postcode, String country);
  this.foo = foo;
  this.bar = bar;

তাহলে আপনার পরিবর্তে এটি থাকতে পারে:


MyClass(Address homeAddress, int foo, double bar) {
  super(homeAddress);
  this.foo = foo;
  this.bar = bar;
}


14

আপনি সম্ভবত যা করতে চান তা হ'ল একটি বিল্ডার শ্রেণি। তাহলে আপনি এই জাতীয় কিছু করবেন:

MyObject obj = new MyObjectBuilder().setXxx(myXxx)
                                    .setYyy(myYyy)
                                    .setZzz(myZzz)
                                    // ... etc.
                                    .build();

পৃষ্ঠা 8 এবং এই জোশ ব্লচের উপস্থাপনা (পিডিএফ), বা কার্যকর জাভার এই পর্যালোচনা অনুসরণ করুন


8

ঠিক আছে, বিল্ডার প্যাটার্ন ব্যবহার করা এক হতে পারে সমাধান ।

তবে একবার আপনি 20 থেকে 30 প্যারামিটারে আসার পরে, আমি অনুমান করব যে পরামিতিগুলির মধ্যে একটি উচ্চ সম্পর্ক রয়েছে। সুতরাং (প্রস্তাবিত হিসাবে) এগুলি যৌক্তিকভাবে বুদ্ধিমান ডেটা-অবজেক্টগুলিতে মোড়ানো সম্ভবত সবচেয়ে অর্থবোধ করে। এইভাবে ডেটা অবজেক্ট প্যারামিটারগুলির মধ্যে ইতিমধ্যে বাধার বৈধতা পরীক্ষা করতে পারে।

অতীতে আমার সমস্ত প্রকল্পের জন্য, একবার আমি অনেকগুলি পরামিতি নিয়ে এসেছি (এবং এটি ২8 নয়!) আমি আরও ভাল একটি ডেটামোডেল তৈরি করে কোডটি স্যানিটাইজ করতে সক্ষম হয়েছি।


4

আপনি জাভা ১.৪-তে সীমাবদ্ধ থাকায় আপনি যদি ডিআই চান তবে স্প্রিং একটি খুব শালীন বিকল্প হবে। ডিআই কেবল সেই জায়গাগুলিতে সহায়ক যেখানে কনস্ট্রাক্টর প্যারামিটারগুলি পরিষেবা বা এমন কিছু যা রানটাইমের সময় পৃথক হয় না।

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


প্যারামিটারগুলি হ'ল বেশিরভাগ পরিষেবাদি যেমনটি আপনি উল্লেখ করেছেন এবং তাই ডিআই হ'ল আমার প্রয়োজন হবে। আমি মনে করি অন্য কয়েকটি উত্তরে উল্লিখিত বিল্ডার প্যাটার্নটি হ'ল আমি যা আশা করছিলাম।
স্টিভ আর্মস্ট্রং

4

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



1

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

একটি জিনিস যা আপনি করতে পারেন তা হ'ল কিছু যৌক্তিকভাবে পরামিতিগুলিকে তাদের নিজস্ব উচ্চ স্তরের বস্তুতে গ্রুপ করা, তবে এটির নিজস্ব সমস্যা রয়েছে।

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