আমি অনেকগুলি ওয়েবসাইটে পড়েছি ptionচ্ছিকটি কেবলমাত্র রিটার্ন টাইপ হিসাবে ব্যবহার করা উচিত, এবং পদ্ধতি আর্গুমেন্টে ব্যবহার করা উচিত নয়। আমি এর যৌক্তিক কারণ খুঁজতে লড়াই করছি। উদাহরণস্বরূপ আমার কাছে লজিকের একটি টুকরা রয়েছে যার মধ্যে 2 টি alচ্ছিক পরামিতি রয়েছে। সুতরাং আমি মনে করি এটির মতো আমার পদ্ধতির স্বাক্ষরটি লিখতে হবে (সমাধান 1):
public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 {
// my logic
}
Webচ্ছিক নির্দিষ্ট অনেক ওয়েব পৃষ্ঠা পদ্ধতি আর্গুমেন্ট হিসাবে ব্যবহার করা উচিত নয়। এই বিষয়টি মাথায় রেখে, আমি নিম্নলিখিত পদ্ধতিটির স্বাক্ষরটি ব্যবহার করতে এবং যুক্তিগুলি বাতিল হতে পারে উল্লেখ করার জন্য একটি স্পষ্ট জাভাদোক মন্তব্য যুক্ত করতে পারি, আশা করি ভবিষ্যতে রক্ষণাবেক্ষণকারীরা জাভাদোকটি পড়বেন এবং তাই সর্বদা আর্গুমেন্টগুলি ব্যবহার করার আগে নাল চেকগুলি পরিচালনা করবেন (সমাধান 2) :
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
বিকল্পভাবে আমি একটি ভাল ইন্টারফেস সরবরাহ করতে এবং এটি আরও সুস্পষ্ট p1 এবং p2 করতে alচ্ছিক (সমাধান 3) করতে আমার চারটি পাবলিক পদ্ধতির সাথে আমার পদ্ধতিটি প্রতিস্থাপন করতে পারি:
public int calculateSomething() {
calculateSomething(null, null);
}
public int calculateSomething(String p1) {
calculateSomething(p1, null);
}
public int calculateSomething(BigDecimal p2) {
calculateSomething(null, p2);
}
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
এখন আমি ক্লাসের কোডটি লেখার চেষ্টা করছি যা প্রতিটি পদ্ধতির জন্য এই যুক্তিকে টুকরোটি করে। আমি প্রথমে অন্য ইনপুট পরামিতিগুলি অন্য কোনও অবজেক্ট থেকে পুনরুদ্ধার করি যা Optional
এর পরে ফিরে আসে এবং আমি অনুরোধ করি calculateSomething
। অতএব, যদি সমাধান 1 ব্যবহার করা হয় তবে কলিং কোডটি দেখতে এরকম হবে:
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1, p2);
যদি সমাধান 2 ব্যবহার করা হয়, কলিং কোডটি দেখতে এরকম হবে:
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1.orElse(null), p2.orElse(null));
যদি সমাধান 3 প্রয়োগ করা হয়, আমি উপরের কোডটি ব্যবহার করতে পারি বা আমি নিম্নলিখিতটি ব্যবহার করতে পারি (তবে এটি উল্লেখযোগ্যভাবে আরও কোড):
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result;
if (p1.isPresent()) {
if (p2.isPresent()) {
result = myObject.calculateSomething(p1, p2);
} else {
result = myObject.calculateSomething(p1);
}
} else {
if (p2.isPresent()) {
result = myObject.calculateSomething(p2);
} else {
result = myObject.calculateSomething();
}
}
সুতরাং আমার প্রশ্ন হ'ল কেন Optional
পদ্ধতি আর্গুমেন্ট হিসাবে সমাধান ব্যবহার করা খারাপ অভ্যাস হিসাবে বিবেচিত হয় (সমাধান 1 দেখুন)? এটি আমার কাছে সবচেয়ে পঠনযোগ্য সমাধানের মতো দেখায় এবং এটি সবচেয়ে স্পষ্ট করে তোলে যে পরামিতিগুলি ভবিষ্যতে রক্ষণাবেক্ষণকারীদের কাছে খালি / নাল হতে পারে। (আমি অবহিত করছি যে Optional
এটির ডিজাইনাররা এটি কেবলমাত্র একটি রিটার্নের ধরণ হিসাবে ব্যবহৃত হবে, তবে এই দৃশ্যে এটি ব্যবহার না করার কোনও যৌক্তিক কারণ আমি খুঁজে পাচ্ছি না)।
null
?