java - রহম - জাভা প্রোগ্রামিং বই pdf free




জাভা 8 এর ptionচ্ছিকটি যুক্তি হিসাবে ব্যবহার করা উচিত নয় (13)

আমি অনেকগুলি ওয়েবসাইটে পড়েছি 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 করতে areচ্ছিক (সমাধান 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
}

এখন আমি ক্লাসের কোডটি লেখার চেষ্টা করছি যা প্রতিটি পদ্ধতির জন্য এই যুক্তিকে টুকরোটি করে। আমি প্রথমে দুটি ইনপুট প্যারামিটারগুলি অন্য কোনও অবজেক্ট থেকে পুনরুদ্ধার করি যা ption 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 দেখুন)? এটি আমার কাছে সবচেয়ে পঠনযোগ্য সমাধানের মতো দেখায় এবং এটি সবচেয়ে স্পষ্ট করে তোলে যে প্যারামিটারগুলি ভবিষ্যতে রক্ষণাবেক্ষণকারীদের কাছে খালি / নাল হতে পারে। (আমি অবগত যে ption Optional ডিজাইনাররা এটি কেবলমাত্র একটি রিটার্ন টাইপ হিসাবে ব্যবহার করার উদ্দেশ্যে তৈরি করেছিল, তবে এই দৃশ্যে এটি ব্যবহার না করার কোনও যৌক্তিক কারণ আমি খুঁজে পাচ্ছি না)।


JDK10, https://docs.oracle.com/javase/10/docs/api/java/util/Optional.html এ জাভাডোকটি দেখুন, একটি এপিআই নোট যুক্ত হয়েছে:

এপিআই দ্রষ্টব্য: ptionচ্ছিকটি মূলত একটি পদ্ধতি রিটার্ন টাইপ হিসাবে ব্যবহারের জন্য তৈরি যেখানে সেখানে "কোনও ফলাফল নয়" উপস্থাপনের স্পষ্ট প্রয়োজন আছে এবং যেখানে নাল ব্যবহারের ফলে ত্রুটি হওয়ার সম্ভাবনা রয়েছে।


Paraচ্ছিককে প্যারামিটার হিসাবে স্বীকার করার ফলে কলার স্তরে অপ্রয়োজনীয় মোড়কের কারণ হয়।

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

public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 {}

ধরুন আপনার কাছে দুটি নাল-স্ট্রিং রয়েছে (যেমন, অন্য কোনও পদ্ধতি থেকে ফিরে এসেছেন):

String p1 = "p1"; 
String p2 = "p2";

আপনি জেনে রাখেন যে তারা খালি নয়, এমনকি আপনি inচ্ছিক এগুলি মোড়ানো করতে বাধ্য হন।

এটি আরও খারাপ হয়ে যায় যখন আপনাকে অন্যান্য "ম্যাপেবল" কাঠামো, যেমন রচনা করতে হয়। Eithers :

Either<Error, String> value = compute().right().map((s) -> calculateSomething(
< here you have to wrap the parameter in a Optional even if you know it's a 
  string >));

সুত্র:

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

সুত্র। https://github.com/teamdigitale/digital-citizenship-functions/pull/148#discussion_r170862749


আমি এই বিষয়টিতে সবচেয়ে ভাল পোস্টটি লিখেছি ড্যানিয়েল ওলসেউসকি লিখেছেন:

যদিও বাধ্যতামূলক পদ্ধতি পরামিতিগুলির জন্য ptionচ্ছিক বিবেচনা করার জন্য এটি লোভনীয় হতে পারে তবে অন্যান্য সম্ভাব্য বিকল্পের সাথে তুলনায় এই জাতীয় সমাধানটি ফ্যাকাশে। সমস্যাটি চিত্রিত করার জন্য, নিম্নলিখিত নির্মাণকারীর ঘোষণা পরীক্ষা করুন:

public SystemMessage(String title, String content, Optional<Attachment> attachment) {
    // assigning field values
}

প্রথম নজরে এটি একটি সঠিক ডিজাইনের সিদ্ধান্ত হিসাবে দেখাতে পারে। সর্বোপরি, আমরা স্পষ্টভাবে সংযুক্তি প্যারামিটারটিকে alচ্ছিক হিসাবে চিহ্নিত করেছি। তবে কনস্ট্রাক্টরকে কল করার ক্ষেত্রে ক্লায়েন্ট কোডটি কিছুটা আনাড়ি হতে পারে।

SystemMessage withoutAttachment = new SystemMessage("title", "content", Optional.empty());
Attachment attachment = new Attachment();
SystemMessage withAttachment = new SystemMessage("title", "content", Optional.ofNullable(attachment));

স্পষ্টতা সরবরাহের পরিবর্তে ptionচ্ছিক শ্রেণীর কারখানার পদ্ধতিগুলি কেবল পাঠককে বিভ্রান্ত করে। মনে রাখবেন একটি মাত্র oneচ্ছিক প্যারামিটার রয়েছে তবে দুটি বা তিনটি থাকার কথা কল্পনা করুন। চাচা বব অবশ্যই এই জাতীয় কোড of নিয়ে গর্ব করবেন না 😉

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

public SystemMessage(String title, String content) {
    this(title, content, null);
}

public SystemMessage(String title, String content, Attachment attachment) {
    // assigning field values
}

এই পরিবর্তনটি ক্লায়েন্ট কোডটি আরও সহজ এবং পড়তে সহজ করে তোলে।

SystemMessage withoutAttachment = new SystemMessage("title", "content");
Attachment attachment = new Attachment();
SystemMessage withAttachment = new SystemMessage("title", "content", attachment);

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

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

আমি যদি কেবল মূল্যটির প্রতি যত্নশীল থাকি তবে পদ্ধতিটি কল করার আগে আমি ইস্প্রেসটি যাচাই করে দেখি, যদি পদ্ধতির মধ্যে আমার কোনও ধরণের লগিং বা ভিন্ন যুক্তি থাকে যা মান বিদ্যমান কিনা তার উপর নির্ভর করে, তবে আমি আনন্দের সাথে Oচ্ছিকটিতে পাস করব।


আমি মনে করি এটি কারণ আপনি সাধারণত ডেটা ম্যানিপুলেট করার জন্য আপনার ফাংশনগুলি লেখেন, এবং তারপরে map এবং অনুরূপ ফাংশনগুলি ব্যবহার করে এটি Optional উত্তোলন করুন। এটি এটিতে ডিফল্ট Optional আচরণ যুক্ত করে। অবশ্যই, কিছু ক্ষেত্রে থাকতে পারে, যখন yourচ্ছিক উপর কাজ করে আপনার নিজস্ব সহায়িকা ফাংশন লিখতে প্রয়োজন হয়।


আরও একটি পদ্ধতির, আপনি কি করতে পারেন

// get your optionals first
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();

// bind values to a function
Supplier<Integer> calculatedValueSupplier = () -> { // your logic here using both optional as state}

একবার আপনি কোনও ফাংশন তৈরি করে নিলে (এই ক্ষেত্রে সরবরাহকারী) আপনি অন্য কোনও পরিবর্তনশীল হিসাবে এটি পাস করতে সক্ষম হবেন এবং এটি ব্যবহার করে কল করতে সক্ষম হবেন

calculatedValueSupplier.apply();

আপনি optionচ্ছিক মান পেয়েছেন কিনা তা এখানে ধারণাটি আপনার ফাংশনের অভ্যন্তরীণ বিশদ হবে এবং প্যারামিটারে থাকবে না। প্যারামিটার হিসাবে alচ্ছিক সম্পর্কে চিন্তা করার সময় ফাংশনগুলি চিন্তা করা আসলে আমার কাছে পাওয়া খুব দরকারী কৌশল।

আপনার প্রশ্নের ভিত্তিতে আপনাকে আসলে এটি করা উচিত কিনা তা আপনার পছন্দের উপর ভিত্তি করে, তবে অন্যরা যেমন বলেছে এটি আপনার এপিআইকে কমদামে কুরুচিপূর্ণ করে তোলে।


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

বলা হচ্ছে, একসাথে পদ্ধতিগুলি শৃঙ্খলাবদ্ধ করা যা বিকল্পগুলি গ্রহণ / প্রত্যাবর্তনগুলি করা যুক্তিসঙ্গত জিনিস, যেমন: মোনাড Maybe


এটি একটি এপিআই ব্যবহারকারী এবং একটি এপিআই বিকাশকারী আমাদের বিভিন্ন প্রয়োজনীয়তা কারণ।

একটি বিকাশকারী একটি সুনির্দিষ্ট স্পেসিফিকেশন এবং সঠিক প্রয়োগের জন্য দায়বদ্ধ। অতএব যদি বিকাশকারী ইতিমধ্যে সচেতন থাকেন যে কোনও যুক্তি optionচ্ছিক হয় বাস্তবায়ন বাস্তবায়িত হয় তবে অবশ্যই এটি সঠিকভাবে মোকাবেলা করা উচিত, এটি বাতিল বা ptionচ্ছিক হোক। ব্যবহারকারীর পক্ষে API যতটা সম্ভব সহজ হওয়া উচিত এবং নালটি সহজতম।

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


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

কার্যকরী প্রোগ্রামিং ভাষাগুলি ption Optional পরামিতিগুলিকে উত্সাহ দেয়। এটি ব্যবহারের সর্বোত্তম উপায়গুলির মধ্যে একটি হ'ল একাধিক liftM2 পরামিতি রয়েছে এবং প্যারামিটারগুলি ধরে রেখে কোনও ফাংশন ব্যবহার করতে liftM2 ব্যবহার করা কোনও শূন্য নয় এবং একটি returning liftM2 ফিরে আসতে হবে (দেখুন http://www.functionaljava.org/javadoc/4.4/functionaljava/fj/data/Option.html#liftM2-fj.F- )। জাভা 8 দুর্ভাগ্যক্রমে একটি খুব সীমাবদ্ধ লাইব্রেরি সমর্থনকারী alচ্ছিকভাবে প্রয়োগ করেছে।

জাভা প্রোগ্রামার হিসাবে আমাদের কেবল উত্তরাধিকার লাইব্রেরিগুলির সাথে ইন্টারঅ্যাক্ট করতে নাল ব্যবহার করা উচিত।


প্যারামিটার হিসাবে কোনও Optional পাস করার সময় সাবধানতা অবলম্বন করার আরেকটি কারণ হ'ল কোনও পদ্ধতিতে একটি জিনিস করা উচিত ... আপনি যদি একটি Optional চ্ছিক প্যারাম পাস করেন তবে আপনি একাধিক কাজের পক্ষে যেতে পারেন, এটি বুলিয়ান পারম পাস করার অনুরূপ হতে পারে।

public void method(Optional<MyClass> param) {
     if(param.isPresent()) {
         //do something
     } else {
         //do some other
     }
 }

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

আপনার উদাহরণস্বরূপ, যেখানে প্রতিটি প্যারামিটারটি alচ্ছিক, আমি গণনার পদ্ধতিটিকে নিজের ক্লাসে নীচের মতো পরিবর্তন করার পরামর্শ দিচ্ছি:

Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();

MyCalculator mc = new MyCalculator();
p1.map(mc::setP1);
p2.map(mc::setP2);
int result = mc.calculate();

যদিও বিষয়টি পুরানো তবে আমি এখনই এটিতে আগ্রহী।

ব্যক্তিগতভাবে আমি সমাধান 3 পছন্দ করি যখন কোনও পদ্ধতির পক্ষে যুক্তি সরবরাহ করা সর্বদা নন নাল হিসাবে বিবেচিত হয় (আমি লম্ববক্স @ নননল যুক্ত করতে চাই)। সুতরাং আপনি যদি সত্যিই আপনার 4 টির সবই গ্রহণ করতে চান তবে কেন কোনও প্যারামিটার অবজেক্ট দ্বারা নয়? হতে পারে আপনার অন্যান্যঅজেক্ট সন্তুষ্ট হতে পারে? সাধারণভাবে আমি জিজ্ঞাসা করব আমি কী এমন একটি API সরবরাহ করতে চাই যা সেগুলি (alচ্ছিক) মানগুলি গ্রহণ করে বা Iচ্ছিক পরামিতিগুলি এড়াতে আমি আবার স্থপতি হতে পারি? আপনি যদি ভাবেন যে আপনার সত্যিই optionচ্ছিক প্যারামিটারগুলি দরকার তবে আমি ধরে নিই যে আপনি এসআরপি ভঙ্গ করেছেন।


Optional চ্ছিক সহ প্যাটার্নটি null এড়ানোর জন্য। কোনও পদ্ধতিতে null হওয়া এখনও পুরোপুরি সম্ভব।

যদিও এটি এখনও সত্যিকভাবে অফিশিয়াল নয়, আপনি জেএসআর -308 স্টাইলের টীকাটি ব্যবহার করতে পারবেন যাতে আপনি ফাংশনে null মান স্বীকার করেন বা না করেন indicate নোট করুন যে আসলে এটি চিহ্নিত করার জন্য আপনার কাছে সঠিক সরঞ্জামের ব্যবস্থা থাকতে হবে এবং এটি একটি প্রয়োগযোগ্য রানটাইম নীতিের চেয়ে আরও একটি স্ট্যাটিক চেক সরবরাহ করবে তবে এটি সাহায্য করবে।

public int calculateSomething(@NotNull final String p1, @NotNull final String p2) {}







optional