দ্রুততার মধ্যে "পূর্বশর্ত" এবং "জোর দেওয়া" এর মধ্যে পার্থক্য?


106

সুইফটে precondition(condition: Bool, message: String)এবং এর মধ্যে পার্থক্য কী assert(condition: Bool, message: String)?

দু'টিই আমার কাছে একই রকম। কোন প্রসঙ্গে আমাদের একে অপরের ব্যবহার করা উচিত?

উত্তর:


125

assertএটি পরীক্ষার সময় স্যানিটি চেক করার জন্য, অন্যদিকে preconditionএমন কিছু থেকে রক্ষা পাওয়ার জন্য যা যদি ঘটে থাকে তবে এর অর্থ আপনার প্রোগ্রামটি যুক্তিসঙ্গতভাবে এগিয়ে যেতে পারছে না।

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

অন্যদিকে, কোনও উপাদান আনার সময় অ্যারেতে একটি সাবস্ক্রিপ্ট বৈধ কিনা তা পরীক্ষা করা precondition। যখন অবৈধ সাবস্ক্রিপ্ট জিজ্ঞাসা করা হয় তখন অ্যারে অবজেক্টটির পক্ষে গ্রহণযোগ্য কোনও পরবর্তী পদক্ষেপ নেই, কারণ এটি অবশ্যই একটি অ-alচ্ছিক মান প্রদান করতে পারে।

দস্তাবেজগুলি থেকে সম্পূর্ণ পাঠ্য (বিকল্প ক্লিক করে assertএবং preconditionএক্সকোডে চেষ্টা করুন ):

পূর্বশর্ত

এগিয়ে অগ্রগতি জন্য একটি প্রয়োজনীয় শর্ত পরীক্ষা করুন।

এমন শর্ত সনাক্ত করতে এই ফাংশনটি ব্যবহার করুন যা অবশ্যই শিপিং কোডে প্রোগ্রামটি অগ্রসর হওয়া থেকে বিরত থাকতে হবে।

  • খেলার মাঠ এবং ওওন বিল্ডগুলিতে (এক্সকোডের ডিবাগ কনফিগারেশনের জন্য ডিফল্ট): যদি মিথ্যাটিকে conditionমূল্যায়ন করা হয়, মুদ্রণের পরে ডিবাগযোগ্য অবস্থায় প্রোগ্রামের প্রয়োগ বন্ধ করুন message

  • ইন-ও বিল্ড করে (এক্সকোডের রিলিজ কনফিগারেশনের জন্য ডিফল্ট): যদি conditionমিথ্যাটিকে মূল্যায়ন করা হয় তবে প্রোগ্রামের প্রয়োগ বন্ধ করুন।

  • -Ounchecked তৈরী করে সালে conditionমূল্যায়ন করা হয় না, কিন্তু অপটিমাইজার অনুমান হতে পারে এটি হবে মূল্যায়ন true। -শিক্ষিত বিল্ডগুলিতে এই ধারণাটি পূরণ করতে ব্যর্থতা একটি গুরুতর প্রোগ্রামিং ত্রুটি।

জাহির করা

একটি alচ্ছিক বার্তা সহ ditionতিহ্যবাহী সি-শৈলী যুক্ত করা।

অভ্যন্তরীণ স্যানিটি চেকগুলির জন্য এই ফাংশনটি ব্যবহার করুন যা পরীক্ষার সময় সক্রিয় থাকে তবে শিপিং কোডের কার্যকারিতা প্রভাবিত করে না। রিলিজ বিল্ডগুলিতে অবৈধ ব্যবহারের জন্য পরীক্ষা করতে; দেখতে precondition

  • খেলার মাঠ এবং ওওন বিল্ডগুলিতে (এক্সকোডের ডিবাগ কনফিগারেশনের জন্য ডিফল্ট): যদি মিথ্যাটিকে conditionমূল্যায়ন করা হয়, মুদ্রণের পরে ডিবাগযোগ্য অবস্থায় প্রোগ্রামের প্রয়োগ বন্ধ করুন message

  • ইন-ও বিল্ডগুলি (এক্সকোডের রিলিজ কনফিগারেশনের জন্য ডিফল্ট), conditionমূল্যায়ন করা হয় না এবং এর কোনও প্রভাব নেই।

  • -Ounchecked তৈরী করে সালে conditionমূল্যায়ন করা হয় না, কিন্তু অপটিমাইজার অনুমান হতে পারে এটি হবে মূল্যায়ন true। -শিক্ষিত বিল্ডগুলিতে এই ধারণাটি পূরণ করতে ব্যর্থতা একটি গুরুতর প্রোগ্রামিং ত্রুটি।


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

4
আপনার প্রশ্নের জবাবে, আমি ব্যক্তিগতভাবে এমন জিনিসগুলি ধরার জন্য দৃ .়রূপগুলি ব্যবহার করি যা আমি যখন এটি লিখছি এবং পরীক্ষা করছি তখন আমার বিল্ডে ঘটবে না। জেএসওএন পড়ার জন্য কোনও গার্ডের বিবৃতি কল্পনা করুন যেখানে data["name"]অস্তিত্ব নেই, তবে এটি হওয়া উচিত। প্রহরীটির ভিতরে দৃsert়তা থাকার কারণে ... অন্যথায় cra cra আমাকে ক্র্যাশ করে এবং সমস্যায় এনে আমার ত্রুটি ধরাতে সহায়তা করবে। একইভাবে, যদি এই কোডটি উত্পাদিত হয়, তবে দাবিটি প্রোগ্রামটি ক্র্যাশ করবে না এবং আমি যে ব্যবহার করেছি তা ব্যাকআপ কোডই return nilগ্রহণ করবে।
আলেক ও

4
আপনার পুরো অ্যাপটি ক্রাশ করার পরিবর্তে সূচিটি পরীক্ষা করা এবং কিছু করা উচিত নয়?
Iulian Onofrei

হ্যাঁ, আপনার সূচিটি পরীক্ষা করা উচিত, তবে সকলেই মাঝে মধ্যে পিছলে যায়, এবং দৃser় ব্যবহারগুলি আপনাকে উপলব্ধি করতে সহায়তা করে যে আপনি ভুলে গিয়ে সূচিটি পরীক্ষা করে নেওয়া উচিত ছিল।
ভিক্টর এঙ্গেল

"তবে আপনি এটি দিয়ে জাহাজে উঠতে চাইবেন না, যেহেতু বহির্মুখী ফলাফল বৈধ হতে পারে এবং সমালোচনামূলক নয় তাই আপনার অ্যাপ্লিকেশনটি ক্র্যাশ করা উচিত নয়"। আপনি আপনার অ্যাপ্লিকেশনটি যতটা জোর দাবিতে পাঠাতে পারেন। রিলিজ অ্যাপ্লিকেশনটিতে
দৃ

91

আমি সুইফট দৃser়পদগুলি পেয়েছি - অনুপস্থিত ম্যানুয়ালটিকে সহায়ক বলে মনে করি

                        debug   release   release
function                -Onone  -O       -Ounchecked
assert()                YES     NO        NO
assertionFailure()      YES     NO        NO**
precondition()          YES     YES       NO
preconditionFailure()   YES     YES       YES**
fatalError()*           YES     YES       YES

এবং সুইফট বিবর্তন সম্পর্কিত আকর্ষণীয় আলোচনা থেকে

- জোর দেওয়া: অভ্যন্তরীণ ত্রুটির জন্য আপনার নিজের কোড পরীক্ষা করা

- পূর্বশর্ত: আপনার ক্লায়েন্টরা আপনাকে বৈধ যুক্তি দিয়েছে তা যাচাই করার জন্য।

এছাড়াও, আপনাকে কী ব্যবহার করবেন সে সম্পর্কে সতর্কতা অবলম্বন করা উচিত, দৃser়তা ব্যর্থতা এবং অপ্টিমাইজেশন স্তরটি দেখুন


আপনি কি নিজের কোড এবং ক্লায়েন্টের পার্থক্যটি ব্যাখ্যা করতে পারেন? ক্লায়েন্ট হিসাবে আপনি বোঝাতে চান যেখানে একটি স্ট্রিং প্রত্যাশিত নম্বর সন্নিবেশ করা? কিছু সাধারণ ত্রুটি পরিচালনার সাথে চিকিত্সা করা উচিত নয়?
মধু

@ মধু আমার মনে হয় তিনি নেটওয়ার্ক এপিআই কলিং, বা ক্লায়েন্টের নিজস্ব প্লাগইনগুলি থেকে আর্গুমেন্ট / ফলাফলগুলি সম্পর্কে বোঝাতে চাইছেন।
চেন লি ইওং

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

@ onmyway133: Xcode Quickhelp থেকে, আমি মনে করি precondition()এবং preconditionFailure()করছে একই আচরণ থাকার । এই ফাংশনগুলির মধ্যে পৃথকটি হ'ল: preconditionভিতরে একটি শর্ত প্রয়োজন, যখন preconditionFailureকেবল বাইরে ফেলে দেওয়া হয়।
nahung89

13

preconditionতাই আপনি মুক্তি মোডে সক্রিয় তা আপনার অ্যাপ অর্ণবপোত এবং পূর্বশর্ত ব্যর্থ অ্যাপ্লিকেশন বিনষ্ট হবে। Assertডিফল্ট হিসাবে কেবল ডিবাগ মোডে কাজ করে।

এনএসএইচপিস্টারে কখন এটি ব্যবহার করব তা আমি এই দুর্দান্ত ব্যাখ্যাটি পেয়েছি:

দাবিগুলি ধ্রুপদী যুক্তি থেকে ধার করা একটি ধারণা। যুক্তি হিসাবে, দৃser়বিজ্ঞান একটি প্রমাণ মধ্যে প্রস্তাব সম্পর্কে বিবৃতি হয়। প্রোগ্রামিংয়ে, জোর দিয়ে প্রোগ্রামার অ্যাপ্লিকেশন সম্পর্কে যে জায়গাগুলি ঘোষিত হয় সেই জায়গাগুলিতে অনুমানগুলি বোঝায়।

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


সংকলন পতাকা ব্যবহার করে জোর দেওয়া সক্ষম এবং অক্ষম করা যেতে পারে; তারা শিপড কোডটিতে সক্রিয় হতে পারে।
পাতুর ইনগি এগিলসন

6

পূর্বশর্ত

func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)

এগিয়ে অগ্রগতি জন্য একটি প্রয়োজনীয় শর্ত পরীক্ষা করুন।

  1. এমন শর্ত সনাক্ত করতে এই ফাংশনটি ব্যবহার করুন যা অবশ্যই শিপিং কোডে প্রোগ্রামটি অগ্রসর হওয়া থেকে বিরত থাকতে হবে।
  2. খেলার মাঠ এবং ওওন বিল্ডগুলিতে (এক্সকোডের ডিবাগ কনফিগারেশনের জন্য ডিফল্ট): শর্তটি যদি মিথ্যা হিসাবে মূল্যায়ন করে তবে বার্তা প্রিন্ট করার পরে ডিবাগযোগ্য অবস্থায় প্রোগ্রামের প্রয়োগ বন্ধ করুন।
  3. ইন-ও বিল্ড করে (এক্সকোডের রিলিজ কনফিগারেশনের জন্য ডিফল্ট): শর্তটি যদি মিথ্যা হিসাবে মূল্যায়ন করে তবে প্রোগ্রামের প্রয়োগ বন্ধ করুন।
  4. অন-পরীক্ষিত বিল্ডগুলিতে, শর্তটি মূল্যায়ন করা হয় না, তবে অপ্টিমাইজারটি ধরে নিতে পারে যে এটি সত্য হিসাবে মূল্যায়ন করবে। -শিক্ষিত বিল্ডগুলিতে এই ধারণাটি পূরণ করতে ব্যর্থতা একটি গুরুতর প্রোগ্রামিং ত্রুটি।

জাহির করা

func assert(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)

একটি alচ্ছিক বার্তা সহ ditionতিহ্যবাহী সি-শৈলী যুক্ত করা।

  1. অভ্যন্তরীণ স্যানিটি চেকগুলির জন্য এই ফাংশনটি ব্যবহার করুন যা পরীক্ষার সময় সক্রিয় থাকে তবে শিপিং কোডের কার্যকারিতা প্রভাবিত করে না। রিলিজ বিল্ডগুলিতে অবৈধ ব্যবহারের জন্য পরীক্ষা করতে; পূর্বশর্ত দেখুন

  2. খেলার মাঠ এবং ওওন বিল্ডগুলিতে (এক্সকোডের ডিবাগ কনফিগারেশনের জন্য ডিফল্ট): শর্তটি যদি মিথ্যা হিসাবে মূল্যায়ন করে তবে বার্তা প্রিন্ট করার পরে ডিবাগযোগ্য অবস্থায় প্রোগ্রামের প্রয়োগ বন্ধ করুন।

  3. ইন-ও বিল্ডস (এক্সকোডের রিলিজ কনফিগারেশনের জন্য ডিফল্ট), শর্তটি মূল্যায়ন করা হয় না এবং এর কোনও প্রভাব নেই
  4. অন-পরীক্ষিত বিল্ডগুলিতে, শর্তটি মূল্যায়ন করা হয় না, তবে অপ্টিমাইজারটি ধরে নিতে পারে যে এটি সত্য হিসাবে মূল্যায়ন করবে। -শিক্ষিত বিল্ডগুলিতে এই ধারণাটি পূরণ করতে ব্যর্থতা একটি গুরুতর প্রোগ্রামিং এরোর is

0

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

ডকুমেন্টেশন লিঙ্ক যুক্ত করা হচ্ছে

এছাড়াও swift.org থেকে চিত্র সংযুক্ত করা

এখানে চিত্র বর্ণনা লিখুন

আরও লক্ষ করুন, পূর্ব শর্তগুলির ক্ষেত্রে এটি নয়। পূর্ব শর্তাদি সহ প্রেরিত কোড ক্রাশ হবে এবং পূর্ব শর্তগুলি সত্য বলে মূল্যায়ন না করা হলে অ্যাপ্লিকেশনটি সমাপ্ত হবে।

সুতরাং সংক্ষেপে, দাবিগুলি ডিবাগিংয়ের জন্য, তবে উত্পাদনকে প্রভাবিত না করে পাঠানো যেতে পারে। উত্সগুলি ডিবাগ মোডে মূল্যায়ন করা হবে তবে উত্পাদনে নয়।

এবং

প্রাক-শর্তাদি উত্পাদন পরিবেশে অপ্রত্যাশিত জিনিস না ঘটে তা নিশ্চিত করার জন্য। এই শর্তগুলির মূল্যায়ন করা হয় এবং আপনার অ্যাপ্লিকেশনটি ভুয়া বলে মূল্যায়ন করা হলে সেগুলি বন্ধ করে দেবে

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