শৃঙ্খলাকারীরা কেন অপ্রচলিত?


46

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

public class DTO {

    private String foo;
    private String bar;

    public String getFoo() {
         return foo;
    }

    public String getBar() {
        return bar;
    }

    public DTO setFoo(String foo) {
        this.foo = foo;
        return this;
    }

    public DTO setBar(String bar) {
        this.bar = bar;
        return this;
    }

}

//...//

DTO dto = new DTO().setFoo("foo").setBar("bar");

32
কারণ জাভা একমাত্র ভাষা হতে পারে যেখানে
সেটারগুলি

11
এটি খারাপ স্টাইল কারণ প্রত্যাবর্তনের মান শব্দার্থগতভাবে অর্থবহ নয়। এটি বিভ্রান্তিকর। একমাত্র উত্সাহে খুব কম কীস্ট্রোক সংরক্ষণ করা হচ্ছে।
usr

58
এই প্যাটার্নটি মোটেই অস্বাভাবিক নয়। এমনকি এটির জন্য একটি নামও রয়েছে। একে সাবলীল ইন্টারফেস বলে
ফিলিপ

9
আরও পাঠযোগ্য ফলাফলের জন্য আপনি কোনও বিল্ডারে এই তৈরিটি বিমূর্ত করতে পারেন। myCustomDTO = DTOBuilder.defaultDTO().withFoo("foo").withBar("bar").Build();আমি এটি করতাম, যাতে সিটাররা ভয়েড হয় এমন সাধারণ ধারণার সাথে দ্বন্দ্ব না করে।

9
ফিলিপ, প্রযুক্তিগতভাবে আপনি ঠিক থাকলেও এটি new Foo().setBar('bar').setBaz('baz')খুব "সাবলীল" বলে মনে হয় না। আমার অর্থ, নিশ্চিত যে এটি ঠিক একইভাবে প্রয়োগ করা যেতে পারে তবে আমি খুব বেশি কিছু পড়ার মতো প্রত্যাশা করছিলামFoo().barsThe('bar').withThe('baz').andQuuxes('the quux')
ওয়েন ওয়ার্নার

উত্তর:


50

সুতরাং কেন এটির কারণ আছে কেন এটি একটি ওওপি কনভেনশন নয়?

আমার সেরা অনুমান: কারণ এটি সিকিউএস লঙ্ঘন করে

আপনি একই পদ্ধতিতে মিশ্রিত (অবজেক্টের অবস্থার পরিবর্তন) এবং একটি ক্যোয়ারী (রাষ্ট্রের অনুলিপি ফেরত - এই ক্ষেত্রে, বস্তুটি নিজেই) পেয়েছেন। এটি অগত্যা কোনও সমস্যা নয়, তবে এটি কিছু প্রাথমিক নির্দেশিকা লঙ্ঘন করে।

উদাহরণস্বরূপ, সি ++ এ, স্টাডি :: স্ট্যাক :: পপ () হ'ল একটি কমান্ড যা অকার্যকর ফিরে আসে এবং std :: stack :: top () এমন একটি কোয়েরি যা স্ট্যাকের শীর্ষ উপাদানগুলির একটি রেফারেন্স প্রদান করে। ধ্রুপদীভাবে, আপনি দুটি একত্রিত করতে চান, তবে আপনি এটি করতে পারবেন না এবং ব্যতিক্রম নিরাপদ হতে পারবেন না । (জাভাতে কোনও সমস্যা নয়, কারণ জাভাতে অ্যাসাইনমেন্ট অপারেটর নিক্ষেপ করে না)।

ডিটিও যদি কোনও মান ধরণের হয় তবে আপনি এর সাথে একই রকম পরিণতি অর্জন করতে পারেন

public DTO setFoo(String foo) {
    return new DTO(foo, this.bar);
}

public DTO setBar(String bar) {
    return new DTO(this.foo, bar);
}

এছাড়াও, যখন আপনি উত্তরাধিকারের সাথে লেনদেন করছেন তখন শৃঙ্খলাবদ্ধ ফিরতি মানগুলি একটি প্রচণ্ড ব্যথা। দেখুন "অদ্ভুতভাবে আবর্তক টেমপ্লেট প্যাটার্ন"

অবশেষে, এখানে সমস্যা আছে যে ডিফল্ট কনস্ট্রাক্টর আপনাকে একটি অবজেক্টের সাথে রেখে দেয় যা বৈধ অবস্থায় রয়েছে। আপনি যদি আবশ্যক একটি বৈধ রাষ্ট্র বস্তুর পুনঃস্থাপন কমান্ড একটি গুচ্ছ চালানোর জন্য, কিছু খুব ভুল সর্বস্বান্ত হয়েছে।


4
অবশেষে, এখানে একটি বাস্তব ক্যাটেন। উত্তরাধিকার হ'ল আসল সমস্যা। আমি মনে করি শৃঙ্খলবদ্ধতা সংমিশ্রণে ব্যবহৃত ডেটা-উপস্থাপন-অবজেক্টগুলির জন্য একটি প্রচলিত সেটার হতে পারে।
বেন

6
"একটি অবজেক্ট থেকে রাষ্ট্রের অনুলিপি ফেরত" - এটি তা করে না।
ব্যবহারকারী 253751

2
আমি তর্ক করবে সেই নির্দেশিকা (iterators মত কিছু উল্লেখযোগ্য ব্যাতিক্রম আছে) নিম্নলিখিত সবচেয়ে বড় কারণে যে এটা কোড করে তোলে যে অতি সম্পর্কে কারণ সহজ।
jpmc26

1
@MatthieuM। নাঃ। আমি প্রধানত জাভা বলি এবং এটি সেখানে উন্নত "তরল" এপিআইতে প্রচলিত আছে - আমি নিশ্চিত এটি অন্যান্য ভাষায়ও রয়েছে exists মূলত আপনি নিজের প্রকারকে প্রসারিত টাইপটিতে জেনেরিক তৈরি করেন। তারপরে আপনি abstract T getSelf()জেনেরিক ধরণের রিটার্ন সহ একটি পদ্ধতি যুক্ত করুন । এখন, thisআপনার সেটারগুলি থেকে ফিরে আসার পরিবর্তে আপনি return getSelf()এবং তারপরে যে কোনও ওভাররাইডিং ক্লাস কেবল নিজেই টাইপটিকে জেনেরিক করে তোলে এবং thisসেখান থেকে ফিরে আসে getSelf। এভাবে সেটটাররা প্রকৃত প্রকারটি ফেরত দেয় এবং ঘোষণার প্রকারটি নয়।
বোরিস স্পাইডার

1
@MatthieuM। সত্যি? সি + টি-এর জন্য সিআরটিপি'র অনুরূপ ...
অনর্থক

33
  1. কয়েকটি কী-স্ট্রোক সংরক্ষণ বাধ্যতামূলক নয়। এটি দুর্দান্ত হতে পারে, তবে ওওপি কনভেনশনগুলি কী-স্ট্রোক নয়, ধারণা এবং কাঠামো সম্পর্কে বেশি যত্নশীল।

  2. প্রত্যাবর্তনের মান অর্থহীন।

  3. অর্থহীন হওয়ার চেয়েও বেশি, প্রত্যাবর্তনের মান বিভ্রান্তিমূলক, যেহেতু ব্যবহারকারীরা প্রত্যাবর্তনের মানটির অর্থ আশা করতে পারে। তারা আশা করতে পারে যে এটি একটি "স্থাবর সেটার"

    public FooHolder {
        public FooHolder withFoo(int foo) {
            /* return a modified COPY of this FooHolder instance */
        }
    }

    বাস্তবে আপনার সেটার বস্তুকে রূপান্তরিত করে।

  4. উত্তরাধিকার নিয়ে এটি ভাল কাজ করে না।

    public FooHolder {
        public FooHolder setFoo(int foo) {
            ...
        }
    }
    public BarHolder extends FooHolder {
        public FooHolder setBar(int bar) {
            ...
        }
    } 

    আমি লিখতে পারি

    new BarHolder().setBar(2).setFoo(1)

    কিন্তু না

    new BarHolder().setFoo(1).setBar(2)

আমার জন্য, # 1 থেকে # 3 গুরুত্বপূর্ণ বিষয়গুলি। ভাল-লিখিত কোডটি সুখের মতো সাজানো পাঠ্য নয়। ভাল-লিখিত কোডটি মৌলিক ধারণা, সম্পর্ক এবং কাঠামো সম্পর্কে। পাঠ্যটি কোডের আসল অর্থের কেবল বাহ্যিক প্রতিবিম্ব।


2
এই আর্গুমেন্টগুলির বেশিরভাগই যে কোনও অনর্গল / চেইনবেল ইন্টারফেসে প্রয়োগ হয়।
কেসি

@ ক্যাসি, হ্যাঁ নির্মাতারা (অর্থাত্ সেটটার সহ) আমি শৃঙ্খলার ক্ষেত্রে সবচেয়ে বেশি দেখতে পাই।
পল ড্রাগার

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

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

3
পয়েন্ট # 4 সম্পর্কে, এটি জাভাতে নিম্নরূপ সমাধান করা যেতে পারে: public class Foo<T extends Foo> {...}সেটার ফিরে আসার সাথে Foo<T>। সেই 'সেটার' পদ্ধতিগুলি, আমি তাদের 'পদ্ধতির সাথে' কল করতে পছন্দ করি। ওভারলোডিং যদি ঠিকঠাক কাজ করে তবে ঠিক Foo<T> with(Bar b) {...}, অন্যথায় Foo<T> withBar(Bar b)
YoYo

12

আমি মনে করি না এটি একটি ওওপি কনভেনশন, এটি ভাষা নকশা এবং এর সম্মেলনের সাথে আরও সম্পর্কিত।

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

অবশ্যই আপনি জিজ্ঞাসা করতে পারেন, কেন স্পেসিফিকেশন অংশ শিকল না। আমি উত্তর জানি না, সম্ভবত এই প্যাটার্নটি তখন জানা ছিল না / জনপ্রিয় ছিল না।


হ্যাঁ, জাভাবিয়ানস ঠিক আমার মনে ছিল।
বেন

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

জাভাতে পদ্ধতিগুলি পাওয়ার জন্য @ মিশেলটি রিফ্লেকটিভ কলগুলি রিটার্নের ধরণ নির্দিষ্ট করে না। যে পদ্ধতিতে ফেরত আসে এমন কোনও কলকে কল করা Object, যার ফলে Voidপদ্ধতিটি voidতার ফেরতের প্রকার হিসাবে সুনির্দিষ্টভাবে উল্লেখ করা হলে এক ধরণের সিঙ্গলটন ফিরে আসতে পারে। অন্যান্য খবরে, দৃশ্যত "মন্তব্য করা কিন্তু ভোট না দেওয়া" একটি ভাল মন্তব্য হলেও "প্রথম পোস্ট" নিরীক্ষণ ব্যর্থ হওয়ার ভিত্তি। আমি এই জন্য শোগ দোষারোপ।

7

অন্য লোকেরা যেমন বলেছে, একে প্রায়শই সাবলীল ইন্টারফেস বলা হয় ।

সাধারণত সেটটাররা কোনও অ্যাপ্লিকেশনে লজিক কোডের প্রতিক্রিয়া হিসাবে ভেরিয়েবলগুলিতে কল পাসিং হয় ; আপনার ডিটিও ক্লাস এটির একটি উদাহরণ। প্রচলিত কোডগুলি যখন সেটাররা কোনও কিছু ফেরত না দেয় তবে এ জন্য স্বাভাবিক is অন্যান্য উত্তর উপায় ব্যাখ্যা করেছেন।

তবে কয়েকটি ক্ষেত্রে রয়েছে যে অনর্গল ইন্টারফেসটি একটি ভাল সমাধান হতে পারে, এগুলি সাধারণ।

  • ধ্রুবকগুলি বেশিরভাগ সেটারে যায়
  • প্রোগ্রাম লজিক সেটারগুলিতে যা পাস তা পরিবর্তন করে না।

কনফিগারেশন সেটআপ করা, উদাহরণস্বরূপ সাবলীল-নিবারনেট

Id(x => x.Id);
Map(x => x.Name)
   .Length(16)
   .Not.Nullable();
HasMany(x => x.Staff)
   .Inverse()
   .Cascade.All();
HasManyToMany(x => x.Products)
   .Cascade.All()
   .Table("StoreProduct");

বিশেষ টেস্টডেটাবাল্ডার ক্লাসগুলি ব্যবহার করে ইউনিট পরীক্ষায় পরীক্ষার ডেটা সেট আপ করা (অবজেক্ট মায়েরা)

members = MemberBuilder.CreateList(4)
    .TheFirst(1).With(b => b.WithFirstName("Rob"))
    .TheNext(2).With(b => b.WithFirstName("Poya"))
    .TheNext(1).With(b => b.WithFirstName("Matt"))
    .BuildList(); // Note the "build" method sets everything else to
                  // senible default values so a test only need to define 
                  // what it care about, even if for example a member 
                  // MUST have MembershipId  set

তবে ভাল সাবলীল ইন্টারফেস তৈরি করা খুব শক্ত , সুতরাং আপনার যখন প্রচুর "স্ট্যাটিক" সেটআপ থাকে তখনই এটি তার পক্ষে মূল্যবান। এছাড়াও সাবলীল ইন্টারফেসটি "সাধারণ" শ্রেণীর সাথে মিশ্রিত করা উচিত নয়; তাই বিল্ডার প্যাটার্নটি প্রায়শই ব্যবহৃত হয়।


5

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

পরিবর্তে:

DTO dto = new DTO().setFoo("foo").setBar("bar");

যে কেউ লিখতে পারে:

(জেএসে)

var dto = new DTO({foo: "foo", bar: "bar"});

(সি # তে)

DTO dto = new DTO{Foo = "foo", Bar = "bar"};

(জাভাতে)

DTO dto = new DTO("foo", "bar");

setFooএবং setBarএরপরে আরম্ভের জন্য আর প্রয়োজন হয় না, এবং পরে পরিবর্তনের জন্য ব্যবহার করা যেতে পারে।

শৃঙ্খলাবদ্ধতা কিছু পরিস্থিতিতে কার্যকর হলেও, শুধুমাত্র নিউলাইন চরিত্রগুলি হ্রাস করার স্বার্থে একক লাইনে সবকিছু স্টাফ করার চেষ্টা না করা গুরুত্বপূর্ণ important

উদাহরণ স্বরূপ

dto.setFoo("foo").setBar("fizz").setFizz("bar").setBuzz("buzz");

কী ঘটছে তা পড়া এবং বুঝতে এটি আরও শক্ত করে তোলে। পুনরায় ফর্ম্যাট করা:

dto.setFoo("foo")
    .setBar("fizz")
    .setFizz("bar")
    .setBuzz("buzz");

বুঝতে অনেক সহজ, এবং প্রথম সংস্করণে "ভুল" আরও স্পষ্ট করে তোলে। আপনি একবারে সেই বিন্যাসে কোডটি রিফ্যাক্ট করে ফেললে, এর আসল কোনও সুবিধা নেই:

dto.setFoo("foo");
dto.setBar("bar");
dto.setFizz("fizz");
dto.setBuzz("buzz");

3
১. প্রতিটি কল একেবারে পরিষ্কার করার আগে উদাহরণটি যুক্ত করে আমি পঠনযোগ্যতার ইস্যুতে সত্যই একমত হতে পারি না। ২. জেএস এবং সি # দিয়ে আপনি যে সূচনাটি দেখালেন সেগুলি নির্মাণকারীদের সাথে কিছুই করার নেই: আপনি জেএস-এ যা করেছেন তা একক যুক্তি দিয়ে যায়, এবং আপনি সি # তে যা করেছেন সেটি একটি সিনট্যাক্স শুগার যা দৃশ্যের পিছনে জেটর এবং সেটটারগুলিকে কল করে এবং জাভা সি # এর মতো জেটর-সেটার শুগার নেই।
বেন

1
@ বেনিডিকটাস, আমি বিভিন্ন বিভিন্ন উপায়ে দেখছিলাম যে ওওপি ভাষাগুলি শৃঙ্খলা ছাড়াই এই সমস্যাটি পরিচালনা করে। পয়েন্টটি অভিন্ন কোড সরবরাহ করার জন্য নয়, মূল বিষয়টি এমন বিকল্পগুলি দেখানো ছিল যা শৃঙ্খলা অপ্রয়োজনীয় করে তোলে।
zzzzBov

2
"প্রতিটি কল একেবারেই পরিষ্কার করে দিচ্ছে না এর আগে উদাহরণ যোগ করা" আমি কখনই দাবি করি নি যে প্রতিটি কল করার আগে উদাহরণটি যুক্ত করা কিছু পরিষ্কার করে দেয়, আমি কেবল বলেছিলাম যে এটি তুলনামূলক সমতুল্য।
zzzzBov

1
VB.NET এর একটি ব্যবহারযোগ্য "উইথ" কীওয়ার্ডও রয়েছে যা একটি সংকলক-অস্থায়ী রেফারেন্স তৈরি করে যাতে যেমন [ /লাইন ব্রেকের প্রতিনিধিত্ব করে ব্যবহার করা] এর With Foo(1234) / .x = 23 / .y = 47সমতুল্য হয় Dim temp=Foo(1234) / temp.x = 23 / temp.y = 47। এ জাতীয় বাক্য গঠনটি দ্ব্যর্থহীনতা তৈরি করে না কারণ .xঅবিলম্বে আশেপাশের "সাথে" বক্তব্যকে আবদ্ধ করা ছাড়া অন্য কোনও অর্থ থাকতে পারে না [যদি সেখানে কিছু না থাকে, বা বস্তুর কোনও সদস্য না থাকে xতবে .xতা অর্থহীন)। ওরাকল জাভাতে এর মতো কিছু অন্তর্ভুক্ত করেনি, তবে এই জাতীয় গঠনটি ভাষাতে সহজেই ফিট করে।
সুপারক্যাট

5

সেই কৌশলটি আসলে বিল্ডার প্যাটার্নে ব্যবহৃত হয়।

x = ObjectBuilder()
        .foo(5)
        .bar(6);

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


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

"বা যদি রিটার্ন অবজেক্টটি কেবলমাত্র নির্ধারিত মান হিসাবে থাকে" তবে আমি এটি ঘৃণা করি, আমি যে মানটি সবে পাস করতে চাইছি তা রাখতে চাইলে আমি প্রথমে এটি একটি চলকতে রাখব put পূর্বে নির্ধারিত মানটি অর্জনে এটি কার্যকর হতে পারে , যদিও (কিছু ধারক ইন্টারফেস এটি করে, আমি বিশ্বাস করি)।
জাব

@ জ্যাব আমি সম্মতি জানাই, আমি সেই স্বরলিপিটির খুব বেশি অনুরাগী নই, তবে এর জায়গাগুলি রয়েছে। যেটি মনে আসে তা হ'ল Obj* x = doSomethingToObjAndReturnIt(new Obj(1, 2, 3)); আমি মনে করি এটি জনপ্রিয়তা অর্জন করেছে কারণ এটি আয়না রয়েছে a = b = c = d, যদিও আমি নিশ্চিত নই যে জনপ্রিয়তা সুপ্রতিষ্ঠিত হয়েছিল। আপনি উল্লেখ করেছেন এমন কিছু আমি দেখেছি, কিছু পরমাণু অপারেশন লাইব্রেরিতে পূর্ববর্তী মানটি ফিরিয়ে দিচ্ছি। গল্পের শিক্ষা? আমি এটি শব্দ করার চেয়ে আরও বিভ্রান্তিকর =)
কর্ট অ্যাম্মন

আমি বিশ্বাস করি যে একাডেমিকরা কিছুটা পেডেন্টিক পান: এই প্রতিমাটির সাথে অন্তর্নিহিত কোনও ভুল নেই। এটি নির্দিষ্ট কিছু ক্ষেত্রে স্পষ্টতা যুক্ত করতে মারাত্মকভাবে দরকারী। উদাহরণস্বরূপ নীচের পাঠ্য বিন্যাসকরণ ক্লাসটি ধরুন যে স্ট্রিংয়ের প্রতিটি লাইন প্রবেশ করে এবং তার চারপাশে একটি এসিআই-আর্ট বক্স আঁকেন new BetterText(string).indent(4).box().print();। সেক্ষেত্রে, আমি একগুচ্ছ গব্বলডিগুককে বাইপাস করে একটি স্ট্রিং নিয়েছি, এডেন্টেড করেছি, এটি বক্স করেছি এবং আউটপুট এনেছি। আপনি এমনকি ক্যাসকেডের মধ্যে একটি সদৃশ পদ্ধতি চাইবেন (যেমন, বলুন .copy()) নিম্নলিখিত সমস্ত ক্রিয়াকে আর মূল পরিবর্তন না করার অনুমতি দিতে।
tgm1024

2

এটি উত্তরের চেয়ে একটি মন্তব্য বেশি, তবে আমি মন্তব্য করতে পারি না, তাই ...

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

উৎপন্ন: উদাহরণস্বরূপ, কিভাবে এই Symfony এর মতবাদ সত্ত্বা আদেশ স্বয়ং-উত্পন্ন সব setters , ডিফল্টরূপে

jQuery কিন্ডা বেশিরভাগ পদ্ধতিতে খুব একই পদ্ধতিতে চেইন করে।


জেএস একটি ঘৃণা
বেন

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

সঙ্গে @Benedictus আমি সম্মতি জ্ঞাপন JAB। আমার কলেজের বছরগুলিতে আমি জেএসকে ঘৃণা করাই উচিত স্ক্রিপ্টিং ভাষা হিসাবে ঘৃণা করতাম, তবে কয়েক বছর এটির সাথে কাজ করার পরে এবং এটি ব্যবহারের সঠিক পদ্ধতি শিখার পরে এসেছি ... আসলে এটি পছন্দ করি । এবং আমি মনে করি যে ES6 এর সাহায্যে এটি সত্যই পরিপক্ক একটি ভাষাতে পরিণত হবে । তবে, আমাকে মাথা ঘুরিয়ে দেওয়ার কারণটি হল ... আমার উত্তরটি জেএসের সাথে প্রথমে কী করবে? ^^ ইউ
এক্সডাইজু

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

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