আপনার কি প্রোডাকশন কোডে আসক্তি স্টেটমেন্টটি বাতিল করা উচিত? [বন্ধ]


32

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

উদাহরণ:

class CustomObject {
    private Object object;

    @Nullable
    public Object getObject() {
        return (object == null) ? generateObject() : object;
    }
}

এখন কল্পনা করুন আমি এটি এটি ব্যবহার করি:

public void useObject(CustomObject customObject) {
    object = customObject.getObject();
    assert object != null;
    // Do stuff using object, which would throw a NPE if object is null.
}

আমাকে বলা হয়েছিল যে আমি assertএগুলি সরাতে হবে , সেগুলি কখনই উত্পাদন কোডে ব্যবহার করা উচিত নয় , কেবল পরীক্ষায় ব্যবহার করা উচিত। এটা কি সত্যি?


19
ডিফল্টরূপে, দাবিগুলি অক্ষম করা হয়। রানটাইমের সময় -eaবা সমতুল্য মাধ্যমে আপনাকে তাদের স্পষ্টভাবে সক্ষম করতে হবে ।
জারোমড

সফটওয়্যার ইঞ্জিনিয়ারিং সম্পর্কিত সম্পর্কিত প্রশ্ন: সফ্টওয়্যারেনজেনারিং.স্ট্যাককেেক্সঞ্জিওক্ট / কিউ / ১৩7১15৮৮/187318 (যদিও এটি বেশ পুরানো, সুতরাং সেখানে গৃহীত উত্তরটি এখনও একটি বাহ্যিক গ্রন্থাগারের সুপারিশ করে, যা Objects.requireNonNullজাভা 8-তে প্রবর্তনের পরে আর প্রয়োজন নেই )।
হাল্ক

এই প্রশ্নের শিরোনামটি অত্যধিক বিস্তৃত, তবে শরীরে যে প্রশ্নটি বর্ণিত হয়েছে তা অনেক বেশি সংকীর্ণ এবং উত্তর অনুসারে সম্পূর্ণরূপে সহায়ক-কার্যকারিতা দ্বারা পরিচালিত হয়।
স্মি

স্পষ্টতই, আপনি জিজ্ঞাসা করছেন যে ক্লায়েন্ট কোডটি অবজেক্টগুলিতে নন-নাল চেক / অ্যাসেরেটগুলি প্রয়োগ করতে হবে। ( লাইব্রেরি কোডটি নিজে গ্যারান্টিযুক্ত হওয়া উচিত বস্তুগুলি নালাগুলি হতে পারে না, বা সেখানে জোর দেওয়া উচিত তা জিজ্ঞাসা করা থেকে আলাদা )।
স্মি

উত্তর:


19

তার Objects.requireNonNull(Object)জন্য ব্যবহার করুন ।

নির্দিষ্ট করা বস্তুর রেফারেন্স নাল নয় তা পরীক্ষা করে। এই পদ্ধতিটি মূলত পদ্ধতি এবং নির্মাণকারীগুলির ক্ষেত্রে প্যারামিটার বৈধকরণের জন্য ডিজাইন করা হয়েছে, [...]

আপনার ক্ষেত্রে এটি হবে:

public void useObject(CustomObject customObject) {
    object = customObject.getObject();
    Objects.requireNonNull(object);
    // Do stuff using object, which would throw a NPE if object is null.
}

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

অন্য সুবিধা হ'ল বিপরীতে নাল চেক সম্পর্কিত অতিরিক্ত নমনীয়তা assertassertবুলিয়ান মান পরীক্ষা করার জন্য একটি কীওয়ার্ড থাকা সত্ত্বেও Objects.requireNonNull(Object)এটি একটি ফাংশন এবং সুতরাং কোডটিতে আরও নমনীয় এবং পঠনযোগ্য এম্বেড করা যেতে পারে। উদাহরণ:

Foo foo = Objects.requireNonNull(service.fetchFoo());

// You cannot write it in on line.
Bar bar = service.fetchBar();
assert bar != null;
service.foo(Objects.requireNonNull(service.getBar()));

// You cannot write it in on line.
Bar bar = service.getBar();
assert bar != null;
service.foo(bar);

মনে রাখবেন যে Objects.requireNonNull(Object)একমাত্র নাল যাচাই করার জন্য যেখানে assertসাধারণীকরণ হয়।assertএক্ষেত্রে কিছুটা আলাদা উদ্দেশ্য রয়েছে, যেমন প্রাথমিকভাবে পরীক্ষা করা। এটি সক্ষম করতে হবে, যাতে আপনি এটি পরীক্ষার জন্য সক্ষম করতে এবং এটি উত্পাদন জন্য অক্ষম করতে পারেন। যাইহোক, উত্পাদন কোড জন্য এটি ব্যবহার করবেন না। এটি অপ্রয়োজনীয় এবং জটিল বৈধতা যা পরীক্ষার জন্য বোঝানো হয়েছে তা দিয়ে অ্যাপ্লিকেশনটিকে ধীর করতে পারে। উত্পাদনের পাশাপাশি পরীক্ষাগুলি থেকে পৃথক পরীক্ষার জন্য পৃথক পরীক্ষার জন্য এটি ব্যবহার করুন।

সম্পর্কে বিশদ জন্য সরকারী ডকুমেন্টেশন দেখুন assert


14
কে এবং কখন উত্তরাধিকার বলে দাবি করেছে? কোন লিঙ্ক / রেফারেন্স? আমি কোনও উত্তম বিকাশকারী "উত্তরাধিকার "টিকে সংজ্ঞায়িত করে সরঞ্জামটি শূন্য-পদচিহ্নের বৈধতা সক্ষম করে যা পরীক্ষায় সহজেই সক্ষম করা যায় এবং উত্পাদন অক্ষম করে।
দিমিত্রি পিসক্লভ

প্রদত্ত যে আপনি রানটাইমে সিদ্ধান্ত নিতে পারেন যে জোর চালনা করে কি না, তবে আপনি রানটাইমে নির্ধারণ করতে পারবেন না যে এনপিই প্রয়োজনীয় ননল দ্বারা নিক্ষেপ করা হয়েছে, আপনি 'দাবী করার চেয়ে এর সাথে আরও নিয়ন্ত্রণ রাখতে চান' এর অর্থ কী?
পিট কির্খাম

@ দিমিত্রিপিস্ক্লোভ আপনি ঠিক বলেছেন, আমি এটি সম্পাদনা করেছি। এটি পরীক্ষার জন্য একটি দুর্দান্ত সরঞ্জাম।
akuzminykh

2
@ পেটকিরখাম আপনি ঠিক বলেছেন, নিয়ন্ত্রণ এটির জন্য ভুল শব্দ ছিল। আমি সিনট্যাক্সের নমনীয়তা সম্পর্কে আরও কথা বলছিলাম। এছাড়াও: আপনি এনপিইগুলি কেন ছুঁড়ে মারতে কোড চান তা খুঁজে পাওয়ার কারণগুলি এখানে থাকতে পারে।
akuzminykh

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

22

উত্সাহগুলি সম্পর্কে মনে রাখা সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হ'ল এগুলি অক্ষম করা যায়, তাই কখনই তাদের মৃত্যুদন্ড কার্যকর করা হবে না।

পিছিয়ে সামঞ্জস্যের জন্য, JVM ডিফল্টরূপে দৃser়তা প্রমাণীকরণ অক্ষম করে। এগুলি অবশ্যই-সক্ষমযোগ্য কমান্ড লাইন যুক্তি বা তার শর্টহ্যান্ড ব্যবহার করে স্পষ্টভাবে সক্ষম করতে হবে:

java -ea com.whatever.assertion.Assertion

সুতরাং, তাদের উপর নির্ভর করা ভাল অভ্যাস নয়।

ডিফল্টরূপে দাবিগুলি সক্ষম করা হয়নি বলে আপনি কখনই ধরে নিতে পারবেন না যে কোডে ব্যবহার করার সময় সেগুলি কার্যকর করা হবে। সুতরাং আপনার সর্বদা নাল মান এবং খালি বিকল্পগুলির জন্য পরীক্ষা করা উচিত, সর্বজনীন পদ্ধতিতে ইনপুটগুলি পরীক্ষা করতে দৃ using়পদগুলি ব্যবহার করা এবং পরিবর্তে একটি চেক করা ব্যতিক্রম ব্যবহার করা উচিত ... সাধারণভাবে সমস্ত চেকগুলি এমনভাবে করুন যেন দৃ the়তা উপস্থিতি ছিল না।


অবশ্যই তাদের উপর নির্ভর করার জন্য খারাপ অনুশীলন, তবে এটি সাধারণভাবে ব্যবহার করা কি খারাপ অভ্যাস?
বড়_ব্যাড_ই

3
@ বিগ_ব্যাড_ই জোর দেওয়া একটি ডিবাগ সরঞ্জাম যা একটি প্রোগ্রামকে যত তাড়াতাড়ি সম্ভব এবং শোরগোলের সাথে ব্যর্থ করার জন্য বিদ্যমান। দাবি সত্ত্বেও কোনও প্রোগ্রাম ব্যর্থ হওয়ার কোনও উপায় নেই তা নিশ্চিত করা এটি টেস্ট স্যুইটের কাজ । ধারণাটি হ'ল, একবার টেস্ট স্যুটটি (এটি 100% কভারেজ পেয়েছে, তাই না?!?) ব্যর্থতা ছাড়াই কার্যকর করা হয়, তারা যেভাবেই ট্রিগার করতে পারে না বলে দৃ remove়তাগুলি সরিয়ে ফেলা সংরক্ষণ করে। অবশ্যই এই যুক্তিতে কিছুটা আদর্শবাদ আছে, তবে এটিই ধারণা।
মাস্টার -

11

আপনাকে যা বলা হচ্ছে তা অবশ্যই একটি মিথ্যা মিথ্যা। কারণটা এখানে.

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

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

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


4

অন্যান্য উত্তর ইতিমধ্যে এটি যথেষ্ট ভাল কভার, কিন্তু অন্যান্য বিকল্প আছে।

উদাহরণস্বরূপ, বসন্তের একটি স্থির পদ্ধতি রয়েছে:

org.springframework.util.Assert.notNull(obj)

তাদের নিজস্ব Assert.something()পদ্ধতি সহ অন্যান্য গ্রন্থাগার রয়েছে । এটি নিজের লেখাও বেশ সহজ।

তবে এটি ওয়েব পরিষেবাদি হলে আপনি কী ব্যতিক্রম নিক্ষেপ করবেন তা মনে রাখবেন। উল্লিখিত পূর্ববর্তী পদ্ধতিটি উদাহরণস্বরূপ, IllegalArgumentExceptionস্প্রিংয়ের ডিফল্টরূপে একটি 500 দেয় যা নিক্ষেপ করে।

একটি ওয়েব পরিষেবা ক্ষেত্রে, এই প্রায়ই হয় না একটি অভ্যন্তরীণ সার্ভার ত্রুটি, এবং একটি 500 করা উচিত হবে না, বরং একটি 400, যা একটি খারাপ অনুরোধ।


1
যদি "দৃsert়তা" পদ্ধতিটি তত্ক্ষণাত্ প্রক্রিয়াটিকে ক্রাশ না করে পরিবর্তে কিছু প্রকারের ব্যতিক্রম ছুঁড়ে ফেলে, তবে এটি দৃ an়তা নয়। পুরো বিষয়টি assertহ'ল উত্পাদিত একটি কোর ফাইলের সাথে তাত্ক্ষণিক ক্রাশ পাওয়া যাতে আপনি শর্ত লঙ্ঘন করা হয়েছে এমন জায়গায় ঠিক আপনার প্রিয় ডিবাগারের সাথে ময়না তদন্ত করতে পারেন।
মাস্টার -

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

আহ, জাভা সত্যিই assertনিক্ষেপ সংজ্ঞায়িত করে। মজাদার. সি / সি ++ সংস্করণটি এ জাতীয় কাজ করে না। এটি অবিলম্বে একটি সংকেত উত্থাপন করে যে ক) প্রক্রিয়াটি মেরে ফেলে এবং খ) একটি কোর ডাম্প তৈরি করে। এটি একটি কারণ হিসাবে এটি করে: এটির দৃ failure় ব্যর্থতা ডিবাগ করা মৃত সহজ কারণ আপনার কাছে এখনও কল স্ট্যাকের সম্পূর্ণ তথ্য উপলব্ধ। assertপরিবর্তে একটি ব্যতিক্রম ছুঁড়ে ফেলার সংজ্ঞা দেওয়া হচ্ছে যা পরে ইচ্ছাকৃতভাবে প্রোগ্রামে ধরা পড়ে (আন) করা যেতে পারে, উদ্দেশ্যকে পরাস্ত করে, ইমো।
কাস্টমস্টার

সি এবং সি ++ তে যেমন কিছু (বা অনেক) অদ্ভুত জিনিস রয়েছে তেমন জাভাতেও রয়েছে। তার মধ্যে একটি Throwable। তারা সবসময় ধরা যেতে পারে। এটি একটি ভাল জিনিস বা না, আমি জানি না। আমার ধারণা এটি নির্ভর করে। অনেক জাভা প্রোগ্রামগুলি ওয়েব পরিষেবাদি, এবং এটি প্রায় কোনও কারণে ক্রাশ হওয়ার জন্য এটি অনাকাঙ্ক্ষিত হবে, সুতরাং প্রায় সমস্ত কিছু ধরা পড়ে এবং লগ হয়। দুর্দান্ত জিনিসগুলির মধ্যে একটি হ'ল স্ট্যাক ট্রেস এবং এটি সাধারণত ব্যতিক্রম বা ত্রুটিযুক্ত হওয়ার কারণ নিজে থেকেই সনাক্ত করতে যথেষ্ট।
ক্রিস্টোফার স্নাইডার

3

যখনই উদারপন্থীভাবে এটি করা হয় প্রোগ্রামিংয়ের ভুলগুলি যেমন বাগগুলি ধরতে সহায়তা করে ।

যুক্তিযুক্তভাবে ঘটতে পারে অর্থাত খারাপভাবে ফর্ম্যাট করা ইনপুট ধরার জন্য দৃsert় ব্যবহার করবেন না। ত্রুটিটি যখন অপরিশোধনযোগ্য হয় কেবল তখনই দৃsert়তা ব্যবহার করুন।

দৃ checked়তা পরীক্ষা করা হয় এমন কোডে কোনও উত্পাদন যুক্তি রাখবেন না put যদি আপনার সফ্টওয়্যারটি ভালভাবে লিখিত হয় তবে এটি তুচ্ছ সত্য হলেও যদি এটি না হয় তবে আপনার সূক্ষ্ম পার্শ্ব প্রতিক্রিয়া থাকতে পারে এবং দৃ enabled়রূপে অক্ষম ও অক্ষম থাকা সহ সামগ্রিকভাবে বিভিন্ন আচরণ করতে পারে।

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

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


2

আপনি যে কোনও সময় দৃsert়তা ব্যবহার করতে পারেন। বিতর্কটি আসে কখন ব্যবহার করা যায়। উদাহরণস্বরূপ গাইড :

  • জনসাধারণের পদ্ধতিতে যুক্তি যাচাইয়ের জন্য দৃser়তাগুলি ব্যবহার করবেন না।
  • আপনার প্রয়োগটির সঠিক ক্রিয়াকলাপের জন্য প্রয়োজনীয় কোনও কাজ করার জন্য দৃ do়তা ব্যবহার করবেন না।

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