সেটটারকে "এটি" ফেরত দেওয়া কি খারাপ অভ্যাস?


249

জাভা রিটার্নে "এটি" দিয়ে সেটটার তৈরি করা কি ভাল বা খারাপ ধারণা?

public Employee setName(String name){
   this.name = name;
   return this;
}

এই প্যাটার্নটি কার্যকর হতে পারে কারণ তারপরে আপনি সেটটারগুলিকে এভাবে চেইন করতে পারেন:

list.add(new Employee().setName("Jack Sparrow").setId(1).setFoo("bacon!"));

এর পরিবর্তে:

Employee e = new Employee();
e.setName("Jack Sparrow");
...and so on...
list.add(e);

... তবে এটি এক প্রকারের মানক সম্মেলনের পরিপন্থী। আমি মনে করি এটি সার্থক হতে পারে কারণ এটি সেটারকে অন্য কিছু উপকারী করতে পারে। আমি এই প্যাটার্নটি কিছু জায়গাগুলি (যেমন জেমক, জেপিএ) ব্যবহার করেছি দেখেছি তবে এটি অস্বাভাবিক বলে মনে হয় এবং কেবলমাত্র খুব ভাল সংজ্ঞায়িত এপিআইয়ের জন্য ব্যবহৃত হয় যেখানে এই প্যাটার্নটি সর্বত্র ব্যবহৃত হয়।

হালনাগাদ:

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


1
যেহেতু আমি এই নকশার প্যাটার্নটি কিছুক্ষণ আগে দেখেছি তাই আমি যেখানেই সম্ভব এটি করি। যদি কোনও পদ্ধতিতে কাজটি করার জন্য স্পষ্টভাবে কিছু ফিরিয়ে দেওয়ার প্রয়োজন না হয় তবে এটি এখন ফিরে আসে this। কখনও কখনও, আমি এমনকি ফাংশনটি পরিবর্তন করে রাখি যাতে কোনও মান ফিরিয়ে দেওয়ার পরিবর্তে এটি বস্তুর কোনও সদস্যের উপর পরিচালিত হয়, যাতে আমি এটি করতে পারি। ইহা চমৎকার. :)
ইনভারসাস

4
টেলিস্কোপিক সেটারগুলির জন্য স্ব এবং বিল্ডারগুলিতে ফিরে আসার জন্য আমি সেটনাম (স্ট্রিং নাম) এর পরিবর্তে নাম (স্ট্রিং নাম) এর সাথে ব্যবহার করতে পছন্দ করি। আপনি যেমন একটি সাধারণ অনুশীলন নির্দেশ করেছেন এবং সেটারের জন্য প্রত্যাশা হ'ল শূন্য হওয়া return "নন-স্ট্যান্ডার্ড" সেটারগুলি বিদ্যমান ফ্রেমওয়ার্কগুলি যেমন জেপিএ সত্তা পরিচালকদের, বসন্ত ইত্যাদির সাথে ভাল আচরণ করতে পারে না
o

দয়া করে প্রতিটি অনুরোধের আগে লাইন ব্রেকগুলি উপস্থাপন করুন :) এবং আপনার আইডিই কনফিগার করুন বা এটি সম্মান না করে যদি একটি উপযুক্ত একটি পান।
মাগানরা

ব্যাপকভাবে ব্যবহৃত ফ্রেমওয়ার্ক (উদাহরণস্বরূপ স্প্রিং এবং হাইবারনেট) কঠোরভাবে (কমপক্ষে তারা ব্যবহার করত) অকার্যকর-সেটটার্স কনভেনশন মেনে চলবে
লেগনা

এছাড়াও দেখুন স্ট্যাকওভারফ্লো.com
পিনো

উত্তর:


83

আমি মনে করি না যে এটিতে বিশেষত কোনও ভুল আছে, এটি কেবল স্টাইলের বিষয়। এটি কার্যকর যখন:

  • আপনাকে এক সাথে অনেকগুলি ক্ষেত্র সেট করতে হবে (নির্মাণ সহ)
  • আপনি কোডটি লেখার সময় আপনাকে কোন ক্ষেত্রগুলি সেট করতে হবে তা আপনি জানেন এবং
  • আপনি বিভিন্ন ক্ষেত্র সেট করতে চান এমন অনেকগুলি সংমিশ্রণ রয়েছে।

এই পদ্ধতির বিকল্পগুলি হতে পারে:

  1. একটি মেগা কনস্ট্রাক্টর (ডাউনসাইড: আপনি প্রচুর নাল বা ডিফল্ট মানগুলি পাস করতে পারেন এবং কোন মানটি কোনটির সাথে মিলে যায় তা জানা শক্ত হয়)
  2. বেশ কয়েকটি ওভারলোডেড কনস্ট্রাক্টর (ডাউনসাইড: একবারে আপনার কয়েকজনের বেশি হয়ে গেলে অস্বাস্থ্যকর হয়ে পড়ে)
  3. কারখানা / স্থিতিশীল পদ্ধতি (ডাউনসাইড: ওভারলোডেড কনস্ট্রাক্টরগুলির মতো - একবারে কয়েকের বেশি হলে অকার্যকর হয়ে পড়ে)

আপনি যদি একবারে কয়েকটি সম্পত্তি সেট করতে যাচ্ছেন তবে আমি বলব যে এটি 'এটি' ফিরিয়ে দেওয়ার পক্ষে উপযুক্ত নয়। আপনি যদি পরে কোনও স্থিতি / সাফল্য সূচক / বার্তার মতো অন্য কোনও কিছু ফেরত দেওয়ার সিদ্ধান্ত নেন তবে তা অবশ্যই নিচে পড়ে।


1
ভাল, সাধারণত আপনি কোনও সেটার কাছ থেকে কনভেনশন করে কোনও কিছুই ফিরিয়ে দেন না।
কেন লিউ

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

12
@ টম ভাল পয়েন্ট, এটি করা গেটার্স এবং সেটটারদের "জাভা বিন" কনভেনশনটি ভেঙে দেয়।
অ্যান্ডি হোয়াইট

2
@ টমক্লিফ্ট "জাভা বিন" কনভেনশন ভাঙ্গার ফলে কি কোনও সমস্যা রয়েছে? লাইব্রেরিগুলি কি "জাভা বিন" কনভেনশন ব্যবহার করে তা রিটার্নের ধরণ বা কেবল পদ্ধতি পরামিতি এবং পদ্ধতির নাম দেখে।
থিও ব্রিসকো

3
এই কারণেই বিল্ডার প্যাটার্নটি বিদ্যমান, সেটারগুলি কিছু ফেরত দেওয়া উচিত নয়, পরিবর্তে, কোনও বিল্ডার তৈরি করা উচিত যদি এটির প্রয়োজন আরও ভাল দেখায় এবং কম কোড নেয় :)
রিকার্ডো

106

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

একে সাধারণত বিল্ডার প্যাটার্ন বা সাবলীল ইন্টারফেস বলা হয়

এটি জাভা এপিআইতেও সাধারণ:

String s = new StringBuilder().append("testing ").append(1)
  .append(" 2 ").append(3).toString();

26
এটি প্রায়শই বিল্ডারগুলিতে ব্যবহৃত হয়, তবে আমি বলব না "এটিই ... একটি বিল্ডার প্যাটার্ন বলা হয়"।
লরেন্স গনসাল্ভেস

10
এটা আমার কাছে মজাদার যে সাবলীল ইন্টারফেসের কিছু যুক্তি হ'ল তারা কোড পড়তে সহজ করে তোলে। আমি দেখতে পেলাম এটি আরও বেশি সুবিধাজনক বলে মনে হচ্ছে, তবে এটি পড়ার পক্ষে আরও কঠিন বলে মনে হয়। এটির সাথে আমার একমাত্র আসল দ্বিমত রয়েছে।
ব্রেন্ট লিখিত কোড

30
এটি ট্রেন-রেক অ্যান্টিপ্যাটার্ন নামেও পরিচিত। সমস্যাটি হ'ল যখন নাল-পয়েন্টার ব্যতিক্রম স্ট্যাক ট্রেসটিতে এইরকম একটি লাইন থাকে, তখন কোন আভাসটি নাল ফিরে আসে আপনার কোনও ধারণা নেই। এটি বলার অপেক্ষা রাখে না যে শৃঙ্খলাবদ্ধতাটি সর্বদাই এড়ানো উচিত, তবে খারাপ গ্রন্থাগারগুলি থেকে সাবধান থাকুন (উদাহরণস্বরূপ হোম-ব্রিউন)।
ddimitrov

18
@ddimitrov আপনি এটা সীমিত যেমন aslong ফিরে এই এটা একটা সমস্যা (শুধুমাত্র প্রথম invokation NPE নিক্ষেপ করা হতে পারে) হতে হবে না
স্টিফান

4
এটি লেখার পক্ষে আরও সহজ এবং অনুমান করা যায় যে আপনি লাইনব্রেকস এবং ইন্ডেনশন দিয়েছেন যেখানে পাঠ্যতা অন্যথায় ক্ষতিগ্রস্থ হবে! (কারণ এটি পুনরাবৃত্তি কোডের অপ্রয়োজনীয় বিশৃঙ্খলা এড়ায় যেমন bla.foo.setBar1(...) ; bla.foo.setBar2(...)আপনি যখন লিখতে bla.foo /* newline indented */.setBar1(...) /* underneath previous setter */ .setBar2(...)পারেন (এইরকম কোনও মন্তব্যে লাইন ব্রেকগুলি ব্যবহার করতে পারবেন না :-( ... আশা করি আপনি এই জাতীয় 10 টি সেটটার বা আরও জটিল কল বিবেচনা করে পয়েন্টটি পেয়ে যাবেন)
আন্দ্রেস ডায়্রিট

90

সংক্ষেপ:

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

কয়েকটি দু'টি বিষয় উল্লেখ করা হয়নি:

  • এটি প্রতিটি ফাংশনটিতে একটি (এবং শুধুমাত্র একটি) কাজ করা উচিত এমন প্রিন্সিপালকে লঙ্ঘন করে। আপনি এটি বিশ্বাস করতে পারেন বা নাও করতে পারেন তবে জাভাতে আমি বিশ্বাস করি এটি ভালভাবে কাজ করে।

  • আইডিইগুলি আপনার জন্য এটি তৈরি করে না (ডিফল্টরূপে)।

  • অবশেষে, এখানে একটি বাস্তব-বিশ্বের ডেটা পয়েন্ট। এভাবে নির্মিত একটি লাইব্রেরি ব্যবহার করে আমার সমস্যা হয়েছে। হাইবারনেটের ক্যোয়ারী বিল্ডার এটি বিদ্যমান লাইব্রেরিতে একটি উদাহরণ। যেহেতু ক্যোয়ারির সেট * পদ্ধতিগুলি কোয়েরি ফিরছে, কেবল কীভাবে এটি ব্যবহার করবেন সে সম্পর্কে স্বাক্ষরটি দেখে এটি বলা অসম্ভব। উদাহরণ স্বরূপ:

    Query setWhatever(String what);
  • এটি একটি দ্ব্যর্থহীনতার পরিচয় দেয়: পদ্ধতিটি কি বর্তমান বস্তুটি (আপনার প্যাটার্ন) পরিবর্তন করে অথবা সম্ভবত ক্যোরিটি সত্যই অপরিবর্তনীয় (খুব জনপ্রিয় এবং মূল্যবান প্যাটার্ন), এবং পদ্ধতিটি একটি নতুন ফিরিয়ে দিচ্ছে। এটি কেবল গ্রন্থাগারটি ব্যবহার করা আরও শক্ত করে তোলে এবং অনেক প্রোগ্রামার এই বৈশিষ্ট্যটি ব্যবহার করে না। যদি সেটারগুলি সেটটার ছিল তবে এটি কীভাবে ব্যবহার করা যায় তা পরিষ্কার।


5
বিটিডব্লিউ, এটি "সাবলীল", "তরল" নয় ... যেমন এটি আপনাকে কথ্য ভাষার মতো একাধিক পদ্ধতি কলের কাঠামো তৈরি করতে দেয়।
কেন লিউ

1
অপরিবর্তনীয়তা সম্পর্কে শেষ পয়েন্টটি খুব গুরুত্বপূর্ণ। এর সহজ উদাহরণ স্ট্রিং। জাভা ডেভসরা আশা করে যে স্ট্রিংয়ের পদ্ধতিগুলি ব্যবহার করার সময় তারা সম্পূর্ণ নতুন উদাহরণ পাবেন এবং একই নয় তবে পরিবর্তিত দৃষ্টান্ত পাবেন। সাবলীল ইন্টারফেসের সাথে এটি পদ্ধতি ডকুমেন্টেশনে উল্লেখ করতে হবে যে প্রত্যাবর্তিত বস্তুটি নতুন উদাহরণের পরিবর্তে 'এটি'।
মেটিটিও

7
যদিও আমি সামগ্রিকভাবে একমত, যদিও আমি "কেবলমাত্র একটি কাজ কর" প্রধানকে লঙ্ঘন করে তা নিয়ে আমি দ্বিমত পোষণ করি। ফিরে আসা thisকঠিন রকেট বিজ্ঞান। :-)
user949300

অতিরিক্ত পয়েন্ট: এটি কমান্ড-কোয়েরি বিচ্ছেদ নীতি লঙ্ঘন করে।
মার্টন_হুন

84

আমি এর জন্য 'সহ' পদ্ধতিগুলি ব্যবহার করতে পছন্দ করি:

public String getFoo() { return foo; }
public void setFoo(String foo) { this.foo = foo; }
public Employee withFoo(String foo) {
  setFoo(foo);
  return this;
}

এভাবে:

list.add(new Employee().withName("Jack Sparrow")
                       .withId(1)
                       .withFoo("bacon!"));

সতর্কতা : এই withXসিনট্যাক্সটি সাধারণত অপরিবর্তনীয় বস্তুর জন্য "সেটটার" সরবরাহ করতে ব্যবহৃত হয়, সুতরাং এই পদ্ধতিগুলির কলকারীরা উপস্থিত উদাহরণটি পরিবর্তনের পরিবর্তে যুক্তিসঙ্গতভাবে নতুন সামগ্রী তৈরি করার আশা করতে পারে expect সম্ভবত আরও যুক্তিসঙ্গত শব্দাবলীর এমন কিছু হতে পারে:

list.add(new Employee().chainsetName("Jack Sparrow")
                       .chainsetId(1)
                       .chainsetFoo("bacon!"));

চেইনসেটএক্স () নামকরণ কনভেনশনের সাথে কার্যত সবাই খুশি হওয়া উচিত।


18
আকর্ষণীয় সম্মেলনের জন্য +1। আমি এটি আমার নিজস্ব কোডে গ্রহণ করব না যেহেতু মনে হচ্ছে এখন প্রতিটি শ্রেণীর ক্ষেত্রে আপনার একটি get, একটি setএবং একটি থাকতে হবে with। যদিও এটি এখনও একটি আকর্ষণীয় সমাধান। :)
পল মানতা

1
আপনি কতবার সেটটারগুলিকে কল করেন এটি নির্ভর করে। আমি খুঁজে পেয়েছি যে যদি সেস্টাররা প্রচুর কল হয় তবে এগুলি যুক্ত করতে অতিরিক্ত সমস্যাটি মূল্যবান কারণ এটি অন্য কোথাও কোডটি সহজতর করে। YMMV
qualidafial

2
এবং যদি আপনি এটি Project Lombok'এর @Getter/@Setterটীকাগুলিতে যুক্ত করেন ... এটি শৃঙ্খলার জন্য দুর্দান্ত হবে। অথবা আপনি সংযুক্তকারীKestrel ( github.com/raganwald/Katy ) এর মতো অনেক কিছু ব্যবহার করতে পারেন যা জাউকিউয়ারি এবং জাভাস্ক্রিপ্ট ভক্তদের ব্যবহার করে।
এহতেশ চৌধুরী

4
@ অ্যালিক্লিজিন-কিলাকা আসলে আমি কেবল লক্ষ্য করেছি যে জাভা ৮-এর জাভা.টাইম অপরিবর্তনীয় ক্লাসগুলি এই প্যাটার্নটি ব্যবহার করে, যেমন লোকালডেট.ওথমথ, ইয়ার সহ, ইত্যাদি
কোয়েডাফায়াল

4
withউপসর্গ একটি ভিন্ন কনভেনশন হয়। যেমন @ কালিফাডিয়াল একটি উদাহরণ দিয়েছে। উপসর্গযুক্ত পদ্ধতিগুলিতে withপ্রত্যাবর্তন করা উচিত নয় thisবরং বর্তমানের উদাহরণের মতো একটি নতুন উদাহরণ কিন্তু withসেই পরিবর্তন। আপনি যখন নিজের অবজেক্টগুলি অপরিবর্তনীয় রাখতে চান তখন এটি করা হয়। সুতরাং আমি যখন একটি পদ্ধতি উপসর্গযুক্ত দেখি তখন আমি withধরে নিই যে আমি একটি নতুন অবজেক্ট পাব, একই বস্তুটি নয়।
টেম্পেক

26

আপনি যদি 'this'সেটার থেকে ফিরে আসতে না চান তবে দ্বিতীয় বিকল্পটি ব্যবহার করতে না চান তবে আপনি বৈশিষ্ট্যগুলি সেট করতে নীচের বাক্য গঠনটি ব্যবহার করতে পারেন:

list.add(new Employee()
{{
    setName("Jack Sparrow");
    setId(1);
    setFoo("bacon!");
}});

একদিকে যেমন আমি মনে করি এটি সি # তে এর হালকা পরিষ্কার:

list.Add(new Employee() {
    Name = "Jack Sparrow",
    Id = 1,
    Foo = "bacon!"
});

16
ডাবল ব্রেস আরম্ভের সমানগুলির সাথে সমস্যা থাকতে পারে কারণ এটি একটি বেনামি অভ্যন্তর শ্রেণি তৈরি করে; দেখুন c2.com/cgi/wiki?DoubleBraceInitialization
Csaba_H

@ সিসবা_ স্পষ্টতই সেই সমস্যাটি সেই ব্যক্তিটির দোষ যে পদ্ধতিটি জালিয়াতি করেছে equalsequalsআপনি কী করছেন তা যদি জানা থাকে তবে বেনামে ক্লাসগুলি মোকাবেলার জন্য খুব পরিষ্কার উপায় রয়েছে।
এজেম্যানসফিল্ড

শুধু তার জন্য একটি নতুন (বেনামে) বর্গ তৈরি করছেন? প্রতিটি উদাহরণের জন্য?
ব্যবহারকারী 85421

11

এটি কেবল গেটার / সেটারদের কনভেনশনকেই ভেঙে দেয় না, এটি জাভা 8 পদ্ধতির রেফারেন্স কাঠামোটিকেও ভেঙে দেয়। MyClass::setMyValueএকটি BiConsumer<MyClass,MyValue>, এবং myInstance::setMyValueএকটি Consumer<MyValue>। যদি আপনার সেটার ফিরতি থাকে this, তবে এটি আর বৈধ উদাহরণ নয় Consumer<MyValue>, বরং এটি Function<MyValue,MyClass>এবং সেটারগুলির পদ্ধতি রেফারেন্স ব্যবহার করে যে কোনও কিছু ভেঙে ফেলবে (সেগুলি বাতিল বাতিল বলে মনে করে)।


2
জাভা যদি কেবল জেভিএম নয়, রিটার্নের ধরণের মাধ্যমে ওভারলোডের কিছু উপায় থাকে তবে এটি দুর্দান্ত esome আপনি খুব সহজেই এই ব্রেকিং পরিবর্তনগুলিকে বাইপাস করতে পারেন।
অ্যাডোরাথ

1
আপনি সর্বদা একটি কার্যকরী ইন্টারফেস সংজ্ঞায়িত করতে পারেন যা উভয়ই প্রসারিত করে Consumer<A>এবং এর Function<A,B>ডিফল্ট বাস্তবায়ন সরবরাহ করে void accept(A a) { apply(a); }। তারপরে এটিকে সহজেই যেকোন একটি হিসাবে ব্যবহার করা যেতে পারে এবং নির্দিষ্ট কোডের প্রয়োজন হয় এমন কোনও কোড ভাঙবে না।
স্টিভ কে

আহা! এটা ঠিক স্পষ্ট ভুল! একে অকার্যকর-সামঞ্জস্যতা বলা হয়। একটি সেটার যা কোনও মান ফেরত দেয় তা গ্রাহক হিসাবে কাজ করতে পারে। ideone.com/ZIDy2M
মাইকেল

8

আমি জাভা জানি না তবে আমি সি ++ এ এটি করেছি। অন্যান্য লোকেরা বলেছে যে এটি লাইনগুলি সত্যই দীর্ঘ এবং সত্যই পড়া শক্ত করে তোলে তবে আমি এটি অনেক বার এর মতো করে করেছি:

list.add(new Employee()
    .setName("Jack Sparrow")
    .setId(1)
    .setFoo("bacon!"));

এটি আরও ভাল:

list.add(
    new Employee("Jack Sparrow")
    .Id(1)
    .foo("bacon!"));

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


"এমনকি আরও ভাল" আধুনিক আইডিইতে উপলব্ধ ফর্ম্যাট উত্স কোড কার্যকারিতা ভাল ধার দেয় না। দুর্ভাগ্যবশত।
থোরবজর্ন রাভন অ্যান্ডারসন

আপনি সম্ভবত সঠিক ... আমি কেবলমাত্র স্ব-ফর্ম্যাটরটি ব্যবহার করেছি এটি ইমাসের স্বয়ংক্রিয় ইনডেন্টিং।
কারসন মায়ার্স

2
উত্স কোড বিন্যাসগুলি চেইনের প্রতিটি পদ্ধতি কল করার পরে একটি সহজ // দিয়ে জোর করা যায়। এটি আপনার কোডটিকে কিছুটা আপ্লুত করে তবে আপনার উল্লম্ব সিরিজের বিবৃতিগুলির অনুভূমিকভাবে পুনরায় ফর্ম্যাট করা এতটা নয়।
কোয়েডাফায়াল

@ কালিডিফায়াল আপনার //প্রতিটি পদ্ধতির পরে প্রয়োজন নেই যদি আপনি নিজের আইডিই ইতিমধ্যে মোড়ানো রেখাগুলিতে যোগ না দেওয়ার জন্য কনফিগার করেন (উদাহরণস্বরূপ গ্রহন> বৈশিষ্ট্য> জাভা> কোড স্টাইল> ফর্ম্যাটার> লাইন মোড়ানো) ইতিমধ্যে মোড়ানো লাইনে কখনও যোগদান করবেন না)।
ডিজেড্যাভমার্ক 16'19

6

'অনর্গল ইন্টারফেস' নামে পরিচিত এই স্কিমটি (পাং উদ্দেশ্যে) এখন বেশ জনপ্রিয় becoming এটি গ্রহণযোগ্য, তবে এটি আসলে আমার চায়ের কাপ নয়।


6

কারণ এটি অকার্যকর ফিরে আসে না, এটি আর একটি বৈধ জাভাবিয়ান সম্পত্তি সেটার নেই। ভিজ্যুয়াল "শিম নির্মাতা" সরঞ্জাম ব্যবহার করে আপনি বিশ্বের সাত জনের মধ্যে একজন বা জেএসপি-বিন-সেটপ্রোপার্টি উপাদান ব্যবহার করে 17 জনের মধ্যে একজন রয়েছেন তা বিবেচনা করে।


আপনি স্প্রিংয়ের মতো শিম-সচেতন ফ্রেমওয়ার্ক ব্যবহার করেন কিনা তাও গুরুত্বপূর্ণ।
ddimitrov

6

কমপক্ষে তত্ত্বে , এটি কলগুলির মধ্যে মিথ্যা নির্ভরতা নির্ধারণ করে জেভিএমের অপ্টিমাইজেশন প্রক্রিয়াগুলিকে ক্ষতি করতে পারে।

এটি সিনট্যাকটিক চিনি হিসাবে ধারণা করা হয়, তবে বাস্তবে সুপার বুদ্ধিমান জাভা 43 এর ভার্চুয়াল মেশিনে পার্শ্ব প্রতিক্রিয়া তৈরি করতে পারে।

এই কারণেই আমি ভোট দিই না, এটি ব্যবহার করবেন না।


10
আকর্ষণীয় ... আপনি কি এই কিছুটা প্রসারিত করতে পারেন?
কেন লিউ

3
সুপারসকলার প্রসেসরগুলি কীভাবে সমান্তরাল সম্পাদনকে মোকাবেলা করে তা চিন্তা করুন। দ্বিতীয় setপদ্ধতিটি কার্যকর করার জন্য বস্তুটি প্রথম পদ্ধতির উপর নির্ভরশীল setযদিও এটি প্রোগ্রামার দ্বারা পরিচিত।
মারিয়ান

2
আমি এখনও অনুসরণ করি না। যদি আপনি দুটি পৃথক স্টেটমেন্ট দিয়ে ফু এবং তারপরে বার সেট করেন তবে আপনি যে জিনিসটির জন্য বার সেট করছেন সেটির জন্য আপনি ফু সেট করছেন তার চেয়ে আলাদা স্টেট রয়েছে। সুতরাং সংকলকও এই বিবৃতিগুলির সমান্তরাল করতে পারল না। কমপক্ষে, আমি এটি দেখতে পাচ্ছি না যে এটি একটি অনাকাঙ্খিত অনুমানের পরিচয় না দিয়ে কীভাবে সম্ভব could এক ক্ষেত্রে অনিয়ন্ত্রিত অনুমান কিন্তু অন্য ক্ষেত্রে নয়)।
মাস্টঙ্ক

12
আপনি যদি না জানেন, পরীক্ষা। -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining Java7 jdk স্পষ্টভাবে শৃঙ্খলাবদ্ধ পদ্ধতিগুলিকে ইনলাইন করে, এবং অকার্যকর সেটারগুলিকে গরম হিসাবে চিহ্নিত করতে এবং সেগুলি খুব সহজেই ইনলাইন করে নেয় এমন একই সংখ্যার পুনরাবৃত্তি করে। আপনাকে JVM- র অপকোড ছাঁটাই অ্যালগরিদমগুলির ক্ষমতাকে অবমূল্যায়ন করার উপায় মনে করে; যদি এটি জানে যে আপনি এটি ফিরিয়ে দিচ্ছেন, তবে এটি জুনিয়র (জাভা রিটার্ন স্টেটমেন্ট) অপকোডটি এড়িয়ে যাবে এবং কেবল স্ট্যাকের উপর ছেড়ে দেবে।
আজাক্স

1
আন্দ্রেস, আমি সম্মত তবে সমস্যাগুলি তখন উপস্থিত হয় যখন আপনার অক্ষম কোডের স্তর থাকে। 99% সময় আপনার স্পষ্টতার জন্য কোড করা উচিত যা এখানে প্রায় অনেক কিছু বলে। তবে এমনও অনেক সময় আসে যখন আপনাকে সাধারণ স্থাপত্যিক অর্থে অকালীনভাবে অনুকূল করতে আপনার বাস্তব বছরগুলির অভিজ্ঞতা ব্যবহার করতে হবে years
কিংবদন্তি লেন্থথ

6

এটি মোটেও খারাপ অভ্যাস নয়। তবে এটি জাভাবিয়ানস স্পেকের সাথে তুলনামূলক নয় ।

এবং এই স্ট্যান্ডার্ড অ্যাক্সেসরগুলির উপর অনেকগুলি স্পেসিফিকেশন নির্ভর করে।

আপনি এগুলিকে সর্বদা একে অপরের সাথে সহাবস্থান করতে পারেন।

public class Some {
    public String getValue() { // JavaBeans
        return value;
    }
    public void setValue(final String value) { // JavaBeans
        this.value = value;
    }
    public String value() { // simple
        return getValue();
    }
    public Some value(final String value) { // fluent/chaining
        setValue(value);
        return this;
    }
    private String value;
}

এখন আমরা তাদের একসাথে ব্যবহার করতে পারি।

new Some().value("some").getValue();

অপরিবর্তনীয় বস্তুর জন্য এখানে আরেকটি সংস্করণ আসবে।

public class Some {

    public static class Builder {

        public Some build() { return new Some(value); }

        public Builder value(final String value) {
            this.value = value;
            return this;
        }

        private String value;
    }

    private Some(final String value) {
        super();
        this.value = value;
    }

    public String getValue() { return value; }

    public String value() { return getValue();}

    private final String value;
}

এখন আমরা এটি করতে পারি।

new Some.Builder().value("value").build().getValue();

2
আমার সম্পাদনা বাতিল হয়ে গেছে, তবে আপনার নির্মাতার উদাহরণটি সঠিক নয়। প্রথমত, .value () কিছুই ফেরায় না এবং এটি someক্ষেত্রও সেট করে না । দ্বিতীয়ত, আপনার একটি সুরক্ষাকারী যুক্ত করা উচিত এবং বিল্ড ইন সেট someকরা উচিত null() তাই Someসত্যিকারের অপরিবর্তনীয়, অন্যথায় আপনি builder.value()আবার একই বিল্ডারের উদাহরণটিতে কল করতে পারেন । এবং সর্বশেষে, হ্যাঁ আপনার একজন বিল্ডার রয়েছে তবে আপনার Someএখনও একজন পাবলিক কনস্ট্রাক্টর রয়েছে, যার অর্থ আপনি খোলামেলাভাবে বিল্ডারের ব্যবহারের পক্ষে নন, অর্থাত ব্যবহারকারী কোনও কাস্টম সেট করার পদ্ধতি ব্যবহার করে চেষ্টা বা অনুসন্ধান করা ছাড়া অন্য কিছুই জানেন না knows valueমোটেই
অ্যাডোরাথ

@ অ্যাডোরথ যদি উত্তরটি ভুল হয় তবে আপনার নিজের উত্তর লিখতে হবে, অন্য কারও আকারে পরিবর্তন করার চেষ্টা করবেন না
CalvT

1
পুনঃটুইট করেছেন ধন্যবাদ! এবং দুঃখিত যদি আমি আগে অভদ্র মনে হয়।
18:57

1
@ অ্যাডোরাথ দয়া করে বর্ধনের জন্য কোনও অতিরিক্ত মন্তব্যে নির্দ্বিধায় দ্বিধা করুন। এফওয়াইআই, আমি সেই ব্যক্তি নই যিনি আপনার সম্পাদনা প্রত্যাখ্যান করেছেন। :)
জিন কোওন

1
আমি জানি আমি জানি. ^^ এবং নতুন সংস্করণের জন্য ধন্যবাদ, এটি এখন সত্যিকারের পরিবর্তনযোগ্য "অপরিহার্য-কিছু" নির্মাতা সরবরাহ করে। এবং এটি আমার সম্পাদনার চেষ্টাগুলির চেয়ে আরও চতুর সমাধান যা তুলনায় কোডটি বিশৃঙ্খলা করে।
অ্যাডোরাথ

4

আপনি যদি একই অ্যাপ্লিকেশনটি পুরো অ্যাপ্লিকেশনটিতে ব্যবহার করেন তবে এটি ঠিক আছে।

অন্যদিকে যদি আপনার আবেদনের বিদ্যমান অংশটি স্ট্যান্ডার্ড কনভেনশন ব্যবহার করে তবে আমি এটিকে আঁকড়ে ধরে আরও জটিল ক্লাসে বিল্ডারদের যুক্ত করব

public class NutritionalFacts {
    private final int sodium;
    private final int fat;
    private final int carbo;

    public int getSodium(){
        return sodium;
    }

    public int getfat(){
        return fat;
    }

    public int getCarbo(){
        return carbo;
    }

    public static class Builder {
        private int sodium;
        private int fat;
        private int carbo;

        public Builder sodium(int s) {
            this.sodium = s;
            return this;
        }

        public Builder fat(int f) {
            this.fat = f;
            return this;
        }

        public Builder carbo(int c) {
            this.carbo = c;
            return this;
        }

        public NutritionalFacts build() {
            return new NutritionalFacts(this);
        }
    }

    private NutritionalFacts(Builder b) {
        this.sodium = b.sodium;
        this.fat = b.fat;
        this.carbo = b.carbo;
    }
}

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

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

4

পাওলো অ্যাব্রান্টস জাভাবিয়ান সেটারগুলিকে সাবলীল করে তোলার আরও একটি উপায় প্রস্তাব করে: প্রতিটি জাভাবিনের জন্য একটি অভ্যন্তরীণ নির্মাতা শ্রেণি নির্ধারণ করুন। যদি আপনি এমন সরঞ্জামগুলি ব্যবহার করেন যা মানগুলি ফেরত দেওয়ার জন্য সেটার দ্বারা ফ্লামক্স হয়ে যায় তবে পাওলোর ধরণটি সহায়তা করতে পারে।



3

আমি সেটটারদের পক্ষে "এটি" রিটার্ন রয়েছে। এটি মটরশুটি মেনে চলতে না পারা যায় না। আমার কাছে, যদি "=" এক্সপ্রেশন / স্টেটমেন্টটি ঠিক থাকে, তবে সেটারগুলি যে রিটার্ন মানগুলি ভাল হয়।


2

আমি এই পদ্ধতির পছন্দ করতাম তবে আমি এর বিরুদ্ধে সিদ্ধান্ত নিয়েছি।

কারণ:

  • পঠনযোগ্যতার। পৃথক লাইনে প্রতিটি সেটফু () রাখতে কোডটি আরও পঠনযোগ্য করে তোলে। আপনি সাধারণত কোডটি একবারে লেখার চেয়ে অনেকবার পড়েন।
  • পার্শ্ব প্রতিক্রিয়া: setFoo () শুধুমাত্র ফিল্ড foo সেট করা উচিত, অন্য কিছুই। এটি ফিরিয়ে দেওয়া একটি অতিরিক্ত "WHAT ছিল"।

আমি যে বিল্ডার প্যাটার্নটি দেখেছি সেগুলি সেটফু (foo) .setBar (বার) কনভেনশনটি ব্যবহার করে না তবে আরও ফু (ফু) .বার (বার) ব্যবহার করে। সম্ভবত ঠিক সেই কারণেই।

এটি সর্বদা স্বাদের বিষয়। আমি ঠিক "ন্যূনতম চমক" পদ্ধতির পছন্দ করি।


2
আমি পার্শ্ব প্রতিক্রিয়া একমত। যে জিনিসগুলি ফেরত দেয় সেগুলি তাদের নাম লঙ্ঘন করে। আপনি foo সেট করছেন, কিন্তু আপনি কোনও জিনিস ফিরে পাবেন? এটি কি কোনও নতুন অবজেক্ট বা আমি পুরানো পরিবর্তন করেছি?
ক্রাচডডগ

2

এই নির্দিষ্ট প্যাটার্নটিকে মেথড চেইনিং বলা হয়। উইকিপিডিয়া লিঙ্ক , এটি বিভিন্ন প্রোগ্রামিং ভাষায় এটি কীভাবে সম্পন্ন হয়েছে তার আরও ব্যাখ্যা এবং উদাহরণ রয়েছে।

PS: সবেমাত্র এটি এখানে রেখে যাওয়ার কথা ভেবেছিলাম, যেহেতু আমি নির্দিষ্ট নামটি খুঁজছিলাম।


1

প্রথম দর্শনে: "ঘাস্তে!"।

আরও চিন্তা

list.add(new Employee().setName("Jack Sparrow").setId(1).setFoo("bacon!"));

আসলে তুলনায় কম ত্রুটি প্রবণতা

Employee anEmployee = new Employee();
anEmployee.setName("xxx");
...
list.add(anEmployee);

তাই বেশ আকর্ষণীয়। সরঞ্জামব্যাগে ধারণা যুক্ত করা হচ্ছে ...


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

1
ব্যক্তিগতভাবে, আমি মনে করি প্রাক্তনটি পড়া সহজ, বিশেষত যদি আপনি এভাবে বেশ কয়েকটি অবজেক্ট তৈরি করছেন।
কেন লিউ

@ কেন: একটি পদ্ধতি কোড করুন। অনর্গল বিন্যাসে একটি অনুলিপি লিখুন; অন্য একটি অনুলিপি। এখন দু'টি অনুলিপি কয়েক জনকে দিন এবং জিজ্ঞাসা করুন কোনটি তাদের পড়া সহজ find কোডে আরও দ্রুত পড়তে হবে।
ওএমজি পনিস

বেশিরভাগ সরঞ্জামের মতো এটি অতিরিক্ত ব্যবহার করা সহজ হতে পারে। জিকিউরি এই কৌশলটির চারদিকে রয়েছে এবং এভাবে দীর্ঘ কল চেইনের প্রবণতা রয়েছে যা আমি পেয়েছি সত্যিকারের পাঠ্যতা ব্যাহত করে।
স্ট্যাটিকসান

2
ঠিক আছে যদি প্রতিটি বিন্দুর আগে লাইন ব্রেক এবং ইন্ডেন্ট করা থাকে। তারপরে, এটি দ্বিতীয় সংস্করণের মতো পঠনযোগ্য হবে। আসলে আরও বেশি, কারণ listশুরুতে কোনও অনর্থক নেই is
মাগানরা

1

হ্যাঁ, আমি মনে করি এটি একটি ভাল ধারণা।

আমি যদি কিছু যুক্ত করতে পারতাম তবে এই সমস্যাটি সম্পর্কে কী হবে:

class People
{
    private String name;
    public People setName(String name)
    {
        this.name = name;
        return this;
    }
}

class Friend extends People
{
    private String nickName;
    public Friend setNickName(String nickName)
    {
        this.nickName = nickName;
        return this;
    }
}

এটি কাজ করবে:

new Friend().setNickName("Bart").setName("Barthelemy");

এটি গ্রহণ করবেন না গ্রহনটি! :

new Friend().setName("Barthelemy").setNickName("Bart");

এটি কারণ কারণ setName () কোনও ব্যক্তিকে নয়, একটি লোককে দেয় এবং পিপলসেটনিকনাম নেই।

আমরা কীভাবে ক্লাসের নামের পরিবর্তে নিজের থেকে ক্লাস ফিরিয়ে দিতে সেটটার লিখতে পারি?

এর মতো কিছু ঠিক আছে (যদি নিজের কীওয়ার্ডটি উপস্থিত থাকে)। এটি কি এখনও বিদ্যমান?

class People
{
    private String name;
    public SELF setName(String name)
    {
        this.name = name;
        return this;
    }
}

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

5
জেনেরিক ব্যবহার করুন। ক্লাস চেইনয়েবল <সেল্ফ চেইনেবেল> {পাবলিক সেল্ফ ডোসোমিংথিং () {রিটার্ন করুন (স্ব) এটি;} techn এটি প্রযুক্তিগত দিক থেকে নিরাপদ নয় (এটি যদি আপনি স্ব-টাইপের সাথে শ্রেণিটি প্রয়োগ করেন তবে এটি শ্রেণি নিক্ষেপযোগ্য হবে না) তবে এটি ক্ষেত্রে সঠিক ব্যাকরণ, এবং সাবক্লাসগুলি তাদের নিজস্ব ধরণটি ফিরিয়ে দেবে।
আজাক্স

এছাড়াও: ব্যাপটিস্ট যে "সেলফ" ব্যবহার করছেন এটি একটি স্ব-প্রকার হিসাবে পরিচিত, এটি অনেক ভাষায় উপস্থিত নেই (স্ক্যালা এখনই আমি এক্ষেত্রে ভাবতে পারি), যেখানে অ্যাজাক্স জেনারিকসের ব্যবহার তথাকথিত "কৌতূহলীভাবে" টেমপ্লেট প্যাটার্ন ", যা স্ব ধরনের অভাব সঙ্গে মানিয়ে নিতে চেষ্টা করে আবর্তক কিন্তু এটি কিছু অপূর্ণতা পেয়েছে: (থেকে class C<S extends C<S>>, একটি প্লেইন চেয়ে নিরাপদ যা S extends C। ক) যদি A extends B, এবং B extends C<B>, এবং আপনি কোনো একটি, আপনি শুধুমাত্র একটি জানি A টি প্রতিটি পদ্ধতিতে ওভাররাইড না করা হলে বি প্রদান করা হয়। খ) আপনি কোনও স্থানীয়, অ-কাঁচা বোঝাতে পারবেন না C<C<C<C<C<...>>>>>
অ্যাডওরথ

1

সাধারণভাবে এটি একটি ভাল অনুশীলন, তবে অপারেশন সফলভাবে সম্পন্ন হয়েছে কি না তা নির্ধারণ করতে আপনার সেট-টাইপ ফাংশনগুলির জন্য বুলিয়ান প্রকারের প্রয়োজন হতে পারে, এটিও এক উপায়। সাধারণভাবে, এটি ভাল বা বিছানা বলে বলার কোনও মতামত নেই, এটি অবশ্যই পরিস্থিতি থেকে আসে।


2
ত্রুটির শর্তটি চিহ্নিত করতে ব্যতিক্রমগুলি কীভাবে ব্যবহার করবেন? অনেক সি প্রোগ্রামার বেদনাদায়কভাবে শিখেছে বলে ত্রুটি কোডগুলি সহজেই এড়ানো যায়। ব্যতিক্রমগুলি স্ট্যাকটিকে বিন্দুতে দাঁড়াতে পারে যেখানে তারা পরিচালনা করতে পারে।
ddimitrov

ব্যতিক্রমগুলি সাধারণত পছন্দনীয়, তবে আপনি ব্যতিক্রমগুলি ব্যবহার করতে না পারলে ত্রুটি কোডগুলিও কার্যকর।
নরেক

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

0

বিবৃতি থেকে

list.add(new Employee().setName("Jack Sparrow").setId(1).setFoo("bacon!"));

আমি দুটি জিনিস দেখছি

1) অর্থহীন বক্তব্য। 2) পাঠযোগ্যতার অভাব।


0

এটি কম পাঠযোগ্য হতে পারে

list.add(new Employee().setName("Jack Sparrow").setId(1).setFoo("bacon!")); 

অথবা এটা

list.add(new Employee()
          .setName("Jack Sparrow")
          .setId(1)
          .setFoo("bacon!")); 

এটি এর চেয়ে আরও বেশি পঠনযোগ্য:

Employee employee = new Employee();
employee.setName("Jack Sparrow")
employee.setId(1)
employee.setFoo("bacon!")); 
list.add(employee); 

8
আমি মনে করি আপনি যদি আপনার সমস্ত কোড এক লাইনে রাখার চেষ্টা না করেন তবে এটি বেশ পঠনযোগ্য।
কেন লিউ

0

আমি বেশ কিছুক্ষণ ধরে আমার সেটার তৈরি করে চলেছি এবং একমাত্র আসল সমস্যাটি এমন লাইব্রেরিগুলির সাথে রয়েছে যা সিম পাঠক / লেখক শিমের অ্যাকসেসরগুলি পেতে কঠোর getPropertyDescripttors এর সাথে লেগে থাকে। এই ক্ষেত্রে আপনার জাভা "শিম" এর মধ্যে যে রিটারগুলি আশা করবেন তা থাকবে না।

উদাহরণস্বরূপ, আমি এটি পরীক্ষার জন্য নিশ্চিত করে নিই না, তবে আমি অবাক হব না যে জ্যাকসন আপনাকে জেসন / মানচিত্র থেকে জাভা অবজেক্ট তৈরি করার সময় সেটার হিসাবে স্বীকৃতি দেবেন না। আমি আশা করি এটির জন্য আমি ভুল (আমি শীঘ্রই এটি পরীক্ষা করব)।

আসলে, আমি একটি লাইটওয়েট এসকিউএল কেন্দ্রিক ওআরএম বিকাশ করছি এবং আমি স্বীকৃত সেটারগুলিতে কিছু কোড বেইং getPropertyDescriptters যুক্ত করতে হবে যা এটি ফেরত দেয়।


0

অনেক আগে উত্তর, কিন্তু আমার দুটি সেন্ট ... এটা ঠিক আছে। আমি চাই এই অনর্গল ইন্টারফেসটি আরও প্রায়ই ব্যবহার করা হত।

'কারখানা' পরিবর্তনশীল পুনরাবৃত্তি নীচে আরও তথ্য যুক্ত করে না:

ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(Foo.class);
factory.setFilter(new MethodFilter() { ...

এটি পরিষ্কার, ইমো:

ProxyFactory factory = new ProxyFactory()
.setSuperclass(Properties.class);
.setFilter(new MethodFilter() { ...

অবশ্যই, ইতিমধ্যে উল্লিখিত উত্তরের একটি হিসাবে, জাভা এপিআই-কে উত্তরাধিকার এবং সরঞ্জামগুলির মতো কিছু পরিস্থিতিতে সঠিকভাবে এটি করার জন্য টুইঙ্ক করতে হবে।


0

অন্য ভাষার নির্মাণগুলি যদি পাওয়া যায় তা ব্যবহার করা ভাল। উদাহরণস্বরূপ, Kotlin, আপনি ব্যবহার করেন সঙ্গে , প্রয়োগ , বা দিন । যদি এই পদ্ধতির ব্যবহার করা হয় তবে আপনার সত্যিকারের প্রয়োজন হবে না আপনার সেটার থেকে একটি দৃষ্টান্ত দেখাবে।

এই পদ্ধতির সাহায্যে আপনার ক্লায়েন্ট কোডটি হতে দেয়:

  • রিটার্নের ধরণের প্রতি উদাসীন
  • বজায় রাখা সহজ
  • সংকলক পার্শ্ব প্রতিক্রিয়া এড়ানো

এখানে কিছু উদাহরণঃ.

val employee = Employee().apply {
   name = "Jack Sparrow"
   id = 1
   foo = "bacon"
}


val employee = Employee()
with(employee) {
   name = "Jack Sparrow"
   id = 1
   foo = "bacon"
}


val employee = Employee()
employee.let {
   it.name = "Jack Sparrow"
   it.id = 1
   it.foo = "bacon"
}

0

আমি যদি একটি এপিআই লিখছি, আমি একবারে সেট হয়ে যাওয়া মানগুলি সেট করতে "এটি রিটার্ন" ব্যবহার করি। আমার যদি অন্য কোনও মান থাকে যা ব্যবহারকারীর পরিবর্তন করতে পারা উচিত, আমি তার পরিবর্তে একটি স্ট্যান্ডার্ড শূন্যতম সেটার ব্যবহার করি।

যাইহোক, এটি সত্যিই পছন্দ করার বিষয় এবং শৃঙ্খলাবদ্ধ সেটারগুলি বেশ দুর্দান্ত দেখায়, আমার মতে।


0

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

এই সমস্ত বিষয় অবশ্যই স্থাপন করার অন্যান্য উপায় রয়েছে তবে এখানে সুবিধাটি হ'ল এটি 1) বহু-পরামিতি পাবলিক কনস্ট্রাক্টর এবং 2) আংশিকভাবে নির্দিষ্ট বস্তুগুলিকে এড়িয়ে চলে। এখানে, আপনার কাছে বিল্ডার যা প্রয়োজন তা সংগ্রহ করুন এবং তারপরে তার "বিল্ড ()" কল করুন, এটি তখন নিশ্চিত করতে পারে যে আংশিক-নির্দিষ্ট বস্তুটি নির্মিত হয়নি, যেহেতু সেই অপারেশনটিকে জনসাধারণের চেয়ে কম দৃশ্যমানতা দেওয়া যেতে পারে। বিকল্পটি হবে "প্যারামিটার অবজেক্টস", তবে আইএমএইচও এই সমস্যাটিকে কেবলমাত্র এক স্তরকে পিছনে ফেলে।

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

সংক্ষেপে, আমি মনে করি এটি একটি ভাল অনুশীলন, যদি সঠিকভাবে ব্যবহার করা হয়।


-4

খারাপ অভ্যাস: একটি সেটর একটি গেটর পেতে সেট

সুস্পষ্টভাবে কোনও পদ্ধতি ঘোষণার বিষয়ে কী, এটি এটি ইউ এর পক্ষে করে

setPropertyFromParams(array $hashParamList) { ... }

অটো-সমাপ্তি এবং রিফ্যাক্টরিং এবং পঠনযোগ্যতা অ্যান্ব বয়লারপ্লেট কোডের জন্য ভাল নয়
Andreas Dietrich

কারণ: 1) আপনাকে অর্ডারটি মনে রাখতে হবে বা ডক্স থেকে এটি পড়তে হবে, 2) আপনি সমস্ত সংকলন-টাইপ ধরণের সুরক্ষা ছেড়ে দিয়েছেন, 3) আপনাকে মানগুলি (এই এবং 2) দিতে হবে অবশ্যই গতিবেগের মধ্যে একটি অ-সমস্যা অবশ্যই ভাষা), ৪) আপনি প্রতিটি অনুরোধে অ্যারে-দৈর্ঘ্য পরীক্ষা করা ব্যতীত এটিকে আরও কার্যকরভাবে প্রসারিত করতে পারবেন না এবং 5) আপনি যদি কিছু পরিবর্তন করেন তবে তা অর্ডার বা নির্দিষ্ট মান এমনকি অস্তিত্বেরও হতে পারে, আপনি এটি পরীক্ষা করতে পারবেন না যে রানটাইম কিংবা timewithout সন্দেহ কম্পাইল এ সব । সেটটার সহ: 1), 2), 3): কোনও সমস্যা নেই। 4) নতুন পদ্ধতি যুক্ত করা কিছুতেই ভাঙবে না। 5) সুস্পষ্ট ত্রুটি বার্তা।
অ্যাডোরাথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.