আমি final
পদ্ধতি পরামিতি এবং স্থানীয় ভেরিয়েবলগুলিকে কোড শব্দ হিসাবে বিবেচনা করি। জাভা পদ্ধতির ঘোষণাগুলি বেশ দীর্ঘ হতে পারে (বিশেষত জেনারিক সহ) - এগুলি আর আর করার দরকার নেই।
ইউনিট পরীক্ষাগুলি যদি সঠিকভাবে লেখা থাকে তবে "ক্ষতিকারক" প্যারামিটারগুলিকে নির্ধারণ করা বাছাই করা হবে, সুতরাং এটি আসলে কখনও সমস্যা হওয়া উচিত নয় । সম্ভাব্য ত্রুটি যা এড়ানো যায় না এড়ানোর চেয়ে ভিজ্যুয়াল স্পষ্টতা আরও গুরুত্বপূর্ণ কারণ আপনার ইউনিট পরীক্ষাগুলিতে পর্যাপ্ত কভারেজ নেই।
ফাইন্ডব্যাগস এবং চেকস্টাইলের মতো সরঞ্জামগুলি যদি প্যারামিটারগুলি বা স্থানীয় ভেরিয়েবলগুলিতে অ্যাসাইনমেন্ট দেওয়া হয় তবে বিল্ডটি ভেঙে ফেলার জন্য কনফিগার করা যেতে পারে, যদি আপনি এই ধরণের বিষয় সম্পর্কে গভীরভাবে চিন্তা করেন।
অবশ্যই, যদি আপনার এগুলি চূড়ান্ত করার দরকার হয়, উদাহরণস্বরূপ কারণ আপনি বেনাম শ্রেণিতে মানটি ব্যবহার করছেন তবে কোনও সমস্যা নেই - এটিই সবচেয়ে সহজ সমাধান।
আপনার প্যারামিটারগুলিতে অতিরিক্ত কীওয়ার্ড যুক্ত করার স্পষ্ট প্রভাব ছাড়াও, এবং এর মাধ্যমে আইএমএইচও তাদের ছদ্মবেশযুক্ত করা, পদ্ধতি প্যারামিটারগুলিতে চূড়ান্ত যোগ করার ফলে প্রায়শই পদ্ধতিটির শরীরে কোড কম পাঠযোগ্য হয়, যা কোডকে আরও খারাপ করে তোলে - "ভাল" হতে কোড যতটা সম্ভব পঠনযোগ্য এবং সহজ হতে হবে। একটি দ্বন্দ্বযুক্ত উদাহরণের জন্য, বলুন আমার কাছে এমন একটি পদ্ধতি রয়েছে যা সংবেদনশীলতার সাথে মামলার কাজ করা দরকার।
ছাড়া final
:
public void doSomething(String input) {
input = input.toLowerCase();
// do a few things with input
}
সহজ। পরিষ্কার করুন। সবাই জানেন যে কী চলছে।
এখন 'ফাইনাল' দিয়ে, বিকল্প 1:
public void doSomething(final String input) {
final String lowercaseInput = input.toLowerCase();
// do a few things with lowercaseInput
}
প্যারামিটারগুলি তৈরি করার final
সাথে কোডার যুক্ত কোডটি আরও নীচে থামিয়ে মনে করে যে সে মূল মানের সাথে কাজ করছে, এমন একটি ঝুঁকি রয়েছে যে কোডটি আরও নীচে ব্যবহার করতে পারে তার input
পরিবর্তে lowercaseInput
, যা এটি করা উচিত নয় এবং যা সুরক্ষিত করতে পারে না, কারণ আপনি পারেন ' T এটা সুযোগ থেকে বের করে (অথবা এমনকি ধার্য null
করতে input
যদি যে এমনকি যাহাই হউক না কেন সাহায্য করবে)।
'ফাইনাল' দিয়ে, বিকল্প 2:
public void doSomething(final String input) {
// do a few things with input.toLowerCase()
}
এখন আমরা সবেমাত্র আরও কোড শব্দের তৈরি করেছি এবং toLowerCase()
এন বার ডাকতে পারফরম্যান্স হিট চালু করেছি introduced
'ফাইনাল' সহ, বিকল্প 3:
public void doSomething(final String input) {
doSomethingPrivate(input.toLowerCase());
}
/** @throws IllegalArgumentException if input not all lower case */
private void doSomethingPrivate(final String input) {
if (!input.equals(input.toLowerCase())) {
throw new IllegalArgumentException("input not lowercase");
}
// do a few things with input
}
কোড শব্দ সম্পর্কে কথা বলুন। এটি একটি ট্রেনের ধ্বংসস্তূপ। আমরা একটি নতুন পদ্ধতি পেয়েছি, একটি প্রয়োজনীয় ব্যতিক্রম ব্লক, কারণ অন্যান্য কোড এটি ভুলভাবে ডাকতে পারে। ব্যতিক্রম কভার আরও ইউনিট পরীক্ষা। সমস্ত একটি সহজ এড়ানোর জন্য, এবং আইএমএইচও ভাল এবং ক্ষতিহীন, লাইন।
এই সমস্যাটিও রয়েছে যে পদ্ধতিগুলি এত দীর্ঘ হওয়া উচিত নয় যে আপনি সহজেই এটিকে সহজেই দেখতে পাবেন না এবং এক নজরে জানতে পারবেন যে প্যারামিটারে একটি কার্য সম্পাদন হয়েছে।
আমি মনে করি এটি একটি ভাল অনুশীলন / শৈলী যে আপনি যদি কোনও প্যারামিটার নির্ধারণ করেন তবে আপনি প্রথমে এটি পদ্ধতিটির প্রথম দিকে করেন, পছন্দসই প্রথম লাইন বা সোজা বুনিয়াদী ইনপুট চেকিংয়ের পরে, কার্যকরভাবে পুরো পদ্ধতির জন্য এটি প্রতিস্থাপন করে , যা এর মধ্যে একটি ধারাবাহিক প্রভাব রাখে পদ্ধতি। পাঠকরা যে কোনও অ্যাসাইনমেন্ট সুস্পষ্ট (স্বাক্ষর ঘোষণার নিকটবর্তী) এবং একটি সামঞ্জস্যপূর্ণ স্থানে প্রত্যাশা করতে জানেন, যা চূড়ান্ত যুক্ত করা এড়াতে চাইছে এমন সমস্যাটি প্রশমিত করে। আসলে আমি পরামিতিগুলিতে খুব কমই বরাদ্দ করি, তবে আমি যদি সর্বদা এটি করি তবে এটি কোনও পদ্ধতির শীর্ষে করি।
এছাড়াও মনে রাখবেন যে final
এটি আপনাকে প্রথমে যেমন মনে হতে পারে তেমন সুরক্ষিত করে না:
public void foo(final Date date) {
date.setTime(0);
// code that uses date
}
final
প্যারামিটারের প্রকারটি আদিম বা অপরিবর্তনীয় না হলে সম্পূর্ণরূপে আপনাকে রক্ষা করে না।