ল্যাম্বডা এক্সপ্রেশন বনাম পদ্ধতি রেফারেন্স [বন্ধ]


114

ইন্টেলিজি আমার ল্যাম্বডা এক্সপ্রেশনগুলি পদ্ধতির উল্লেখগুলির সাথে প্রতিস্থাপনের জন্য আমাকে প্রস্তাব রাখে।

তাদের উভয়ের মধ্যে কি কোনও উদ্দেশ্যগত পার্থক্য রয়েছে?


4
আসলেই নয়, আমি কোনও বস্তু দেখছি না! দেখে মনে হচ্ছে এটি আমার কাছে স্থির কল
জেরার্ড

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

15
ল্যাম্বডা এক্সপ্রেশনের কোডটি একটি সিনথেটিক পদ্ধতিতে সংকলিত হয় যখন পদ্ধতির উল্লেখ ছাড়াই কাজ হয় (ব্যতিক্রম: বিশেষ কাঠামো যেমন Type[]::new)। রানটাইমের সময় উত্পন্ন বেনাম শ্রেণি একই হবে। জেআরই তাদের মধ্যে কোনও পার্থক্য করে না। সুতরাং কোনও পদ্ধতির রেফারেন্স ব্যবহার করা আপনাকে আপনার সংকলিত কোডে একটি পদ্ধতি বাঁচাতে পারে, অন্যদিকে, ধাপে ধাপে ডিবাগিং করার সময় আপনি এগুলি থামাতে পারবেন না ...
হোলার

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

3
দুই বছরের পুরানো বদ্ধ প্রশ্নের উত্তর দেওয়া সম্ভবত একটি খারাপ ধারণা তবে যারা সত্যই এই প্রশ্নটি পড়েন তাদের কাছে ওরাকলের টিউটোরিয়াল ( ডকস.ওরাকল / জাভাসে / টিউটোরিয়াল / জাভা / জাভা ইউ / ২ ) যা বলেছেন: পদ্ধতি উল্লেখগুলি ... ইতিমধ্যে একটি নাম রয়েছে এমন পদ্ধতিগুলির জন্য কমপ্যাক্ট, সহজেই পঠনযোগ্য লাম্বদা এক্সপ্রেশন।
আগামীকাল

উত্তর:


187

আমরা কেন ভাষায় এই বৈশিষ্ট্যটি যুক্ত করেছি সে সম্পর্কে কিছুটা দৃষ্টিকোণ সরবরাহ করি, যখন স্পষ্টভাবে আমাদের কঠোরভাবে প্রয়োজন হয়নি (সমস্ত পদ্ধতির রেফগুলি ল্যাম্বডাস হিসাবে প্রকাশ করা যেতে পারে))

মনে রাখবেন যে কোনও সঠিক উত্তর নেই । "সর্বদা একটি ল্যাম্বদার পরিবর্তে একটি পদ্ধতি রেফ ব্যবহার করুন" বা "সর্বদা একটি পদ্ধতি রেফের পরিবর্তে ল্যাম্বডা ব্যবহার করুন" বলছেন এমন কেউ এড়ানো উচিত।

এই প্রশ্নটি "আমি কখন একটি বেনাম শ্রেণি বনাম একটি বর্গ ব্যবহার করব" এর সাথে আত্মার সাথে খুব মিল? এবং উত্তরটি হ'ল: যখন আপনি এটি আরও পাঠযোগ্য । অবশ্যই কিছু ক্ষেত্রে রয়েছে যা অবশ্যই একটি বা অন্যটি অবশ্যই হয় তবে মাঝখানে ধূসর একটি হোস্ট রয়েছে এবং রায় অবশ্যই ব্যবহার করা উচিত।

পদ্ধতি রেফের পিছনে তত্ত্বটি সহজ: নামগুলির বিষয় । যদি কোনও পদ্ধতির কোনও নাম থাকে, তবে কোডের একটি অত্যাবশ্যক ব্যাগের পরিবর্তে নাম দ্বারা এটি উল্লেখ করা যা শেষ পর্যন্ত কেবল ঘুরিয়ে দেয় এবং এটিকে আহ্বান করে, এটি প্রায়শই (তবে সর্বদা নয়!) আরও স্পষ্ট এবং পঠনযোগ্য।

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

পদ্ধতিটি পরিষ্কার করে দেয় বা না হয় সে সম্পর্কে একটি মূল বিবেচনা হ'ল এটি উপস্থাপন করা হচ্ছে যে ফাংশনটির প্রতিনিধিত্বকারী আকারটি কী context কিছু ক্ষেত্রে (উদাহরণস্বরূপ, map(Person::getLastName)এটি প্রসঙ্গটি থেকে একেবারে স্পষ্ট যে একটি ফাংশন যা একটি জিনিসকে অন্যের কাছে মানচিত্রের প্রয়োজন হয় এবং এটির ক্ষেত্রে পদ্ধতির উল্লেখগুলি উজ্জ্বল হয় others অন্য ক্ষেত্রে, কোনও পদ্ধতি রেফ ব্যবহার করে পাঠককে কী ধরণের সম্পর্কে ভেবে ভেবে দেখা উচিত ফাংশনটির বর্ণনা দেওয়া হচ্ছে; এটি একটি সতর্কতা সংকেত যে লাম্বদা আরও দীর্ঘতর হলেও পড়তে পারা যায়।

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


25
@ জেরার্ড আপনাকে ধন্যবাদ আরও ভাল উত্তর হতে পারে ধন্যবাদ।
ইয়াসিন হাজাজ

3
@ জেরার্ডের কাছে মনে হচ্ছে ব্রায়ান "না, সেখানে নেই" বলছে
ডিজে 18

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

@ এমফিনস্টাইন প্রতিটি পদ্ধতির রেফের জন্য, একটি সমতুল ল্যাম্বডা থাকে (যা আপনি ব্যবহার করতে পারেন বা নাও করতে পারেন)। প্রশ্ন হিসাবে কোড পোস্ট করবেন?
ব্রায়ান গয়েটজ

আমি চাই, তবে আমি আশঙ্কা করছি কোডটি খুব বড় হতে পারে, যেহেতু এটি একটি অ্যান্ড্রয়েড LiveData, এ এর ​​ভিতরে Fragment, যা আমি একটি Eventদ্বারা রূপান্তরিত হয়েছিল যা একটি রূপান্তরিত হয়েছিল ViewModel... এবং অ্যান্ড্রয়েড যখন আবার ফিরে আসে তখন ভিন্ন আচরণ ঘটে Fragment...
.সেই

10

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

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


3
তুলনা করুন: houses.map(House::getName)এবং houses.map(h -> h.getName())। ল্যাম্বদা দুটি কম অক্ষর নেয়। এটি সত্য যে প্রকারটি সুস্পষ্ট নয়, তবে কোনও আইডিই আপনাকে বলবে, এবং টাইপ স্পষ্ট হলে ল্যাম্বডাস ব্যবহার করা উচিত। পুনঃব্যবহারযোগ্যতার সাথে আমি আপনার সাথে একমত হতে পারি, তবে ল্যাম্বডাস সংক্ষিপ্তভাবে ক্ষুদ্রতর তাই তারা বড় বড় নির্দিষ্ট পদ্ধতি তৈরির পরিবর্তে শৃঙ্খলিত হতে পারে। সেই দিক থেকে, কিছু বড় এবং জটিল পদ্ধতির চেয়ে ছোট পদ্ধতিগুলি পুনরায় ব্যবহারযোগ্য এবং ল্যাম্বডাসের স্পষ্টতার কারণে (এবং কিছুটা ডিগ্রি, ভার্বোসিটি) এগুলি এখনও পড়া সহজ।
জেরার্ড

11
আমি জেরাল্ডের সাথে আছি। আপনি যখন কোডটি সরিয়ে নিয়ে যান তখন পাঠযোগ্যতার ক্ষতি হয়, তাই আপনাকে পড়া চালিয়ে যাওয়ার জন্য এটিতে ঝাঁপিয়ে পড়তে হবে, তারপরে পিছনে ঝাঁপ দাও। আপনি একই স্থানে সমস্ত প্রাসঙ্গিক কোড রাখতে চান । এছাড়াও, Houseএকটি খুব সৌম্য উদাহরণ; কী ThreeStoryRedBrickHouseWithBlueDoors। আমি একাধিক-আর্গুমেন্ট ল্যাম্বডাসের জন্য পদ্ধতির রেফারেন্সকে পছন্দ করি এবং কখনও কখনও জোর দিয়ে বলি যে ল্যাম্বডা কেবল একটি পদ্ধতি পদ্ধতি কল সম্পর্কে। কোনও পদ্ধতির রেফারেন্সের সাথে ভুল হওয়া কম: আপনি সম্ভবত ব্যবহারের সাইটে
তর্কটি ভুলভাবে

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