@ ননল দিয়ে শূন্যের জন্য টিকিট দেওয়া প্যারামিটারগুলি দেখুন?


19

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

// service layer accessible from outside
public Person createPerson(@CheckForNull String name) {
    return new Person(Preconditions.checkNotNull(name));
}

...

// internal constructor accessed only by the service layer
public Person(@Nonnull String name) {
    this.name = Preconditions.checkNotNull(name);  // remove this check?
}

আমি বুঝতে পারি যে মানগুলি নিজেই @Nonnullঅবরুদ্ধ করে না null

যাইহোক, যে ফাইন্ডব্যাগগুলি চিহ্নহীন ক্ষেত্র থেকে চিহ্নিত চিহ্নিত স্থানে যে কোনও স্থান স্থানান্তরিত হবে তা নির্দেশ করবে @Nonnull, আমরা যে কোনও nullজায়গাতেই এই মানগুলি পরীক্ষা না করেই এই মানগুলি (যা এটি করে) ধরার জন্য তার উপর নির্ভর করতে পারি না? পদ্ধতি? আমি কি সরঞ্জামটি বিশ্বাস করতে এবং এই ভার্বোস চেকগুলি এড়াতে নির্দোষ?

নীচের লাইন:null নীচের দ্বিতীয় চেকটি সরিয়ে ফেলা নিরাপদ বলে মনে হচ্ছে , এটি কি খারাপ অভ্যাস?

এই প্রশ্নটি সম্ভবত নালটির জন্য পরীক্ষা করা উচিত কিনা নলের জন্য খুব ভাল অনুরূপ , তবে আমি টীকাটির সাথে বিশেষভাবে জিজ্ঞাসা করছি @Nonnull

উত্তর:


6

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

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

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

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

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

তদ্ব্যতীত, চুক্তিগুলি স্থিতিশীল বিশ্লেষণের জন্য ব্যবহার করা যেতে পারে, যা উত্স কোডটি বাস্তবে চালিত না করেই সিদ্ধান্তগুলি আঁকতে চেষ্টা করে।

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

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

আপনি যদি @ নন্নলকে (হালকা) চুক্তি হওয়ার বিষয়ে আমার দৃষ্টিভঙ্গিটি ভাগ করেন তবে অতিরিক্ত চেক যোগ না করা সাধারণ বিষয় হবে কারণ এই নীতিটির পিছনে মূল ধারণাটি প্রতিরক্ষা প্রোগ্রামিং এড়ানো avoid


2
@Nonnullচুক্তির স্পেসিফিকেশন হিসাবে আমি ঠিক এভাবেই ব্যবহার করছি । আমি চুক্তির পিছনে রক্ষণাত্মক চেকগুলি সরিয়েছি এবং এখনও পর্যন্ত কোনও সমস্যায় পড়েনি।
ডেভিড হার্কনেস

4

ভাল, আপনি কেন লিখছেন না তা বিবেচনা করুন

this.name = Preconditions.checkNotNull(name);  // Might be necessary
that.name = Preconditions.checkNotNull(this.name);  // Who knows?

প্রোগ্রামিং কালো যাদু নয়। ভেরিয়েবলগুলি হঠাৎ নাল হয়ে যায় না। যদি আপনি জানেন যে কোনও চলক নাল নয়, এবং আপনি জানেন যে এটি পরিবর্তন হয়নি তবে তা পরীক্ষা করে দেখুন না।

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


3
@Nonnullচুক্তি শর্তাধীন কলারের পাস যে আবশ্যক না nullকন্সট্রাকটর, এবং FindBugs স্ট্যাটিক বিশ্লেষণ ব্যবহার কলের তা সনাক্ত করতে মঞ্জুর পারে খোজা null--specifically কল মান চিহ্নিত করা পাস @Nonnullনিজেদের। তবে একজন কলার nullফাইন্ডব্যাগগুলির সতর্কতাটি পাস এবং অজানা করতে পারেন।
ডেভিড হার্কনেস

প্রোগ্রামিং আদর্শভাবে জাদু নয়। দুর্ভাগ্যক্রমে, সতর্কতা এবং আশ্চর্যতা প্রচুর, বিশেষত যখন সেখানে কিছু সংগত কোডের সাথে কাজ করা হচ্ছে ♬ ~ ᕕ (ᐛ) ᕗ
টিম হার্পার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.