কেন আমি কোড চুক্তি ব্যবহার করব


26

আমি সম্প্রতি কোড চুক্তির জন্য মাইক্রোসফ্টের কাঠামোর উপর হোঁচট খেয়েছি।

আমি কিছুটা ডকুমেন্টেশন পড়েছি এবং নিজেকে ক্রমাগত জিজ্ঞাসা করতে দেখেছি: "কেন আমি কখনই এটি করতে চাই, কারণ এটি স্থির বিশ্লেষণ করে না এবং প্রায়শই তা করতে পারে না।"

এখন, আমার কাছে ইতিমধ্যে এক ধরণের প্রতিরক্ষামূলক প্রোগ্রামিং স্টাইল রয়েছে, এর ব্যতিক্রম রক্ষার সাথে:

if(var == null) { throw new NullArgumentException(); }

আমি খুব নুলবজেক্ট প্যাটার্ন ব্যবহার করছি এবং খুব কমই সমস্যা আছে। এতে ইউনিট টেস্ট যুক্ত করুন এবং আপনি সব সেট আপ করেছেন।

আমি কখনও দৃ as়পদগুলি ব্যবহার করি নি এবং সেগুলি কখনও মিস করি না। পুরোপুরি বিপরীত. আমি কোডটিকে সত্যই ঘৃণা করি যার মধ্যে প্রচুর অর্থহীন দৃser়তা রয়েছে, যা কেবল আমার কাছে শোরগোল এবং আমি যা দেখতে চাই তা থেকে আমাকে বিভ্রান্ত করে। কোড চুক্তি, অন্তত মাইক্রোসফ্ট উপায় অনেক একই - এবং আরও খারাপ। তারা কোডে প্রচুর শব্দ এবং জটিলতা যুক্ত করে। 99% এ ব্যতিক্রম যাইহোক যাইহোক নিক্ষেপ করা হবে - সুতরাং এটি দৃ it's় / চুক্তি থেকে আসল সমস্যা কিনা তা আমি মাথা ঘামাই না। খুব খুব কম, খুব কম কেসই রয়ে গেছে যাতে প্রোগ্রামের রাজ্যগুলি সত্যই দূষিত হয়ে যায়।

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



1
আপনি কেন বলছেন "এটি স্থির বিশ্লেষণ করে না এবং প্রায়শই পারে না"? আমি ভেবেছিলাম যে এই প্রকল্পের অন্যতম পয়েন্ট ছিল (কেবলমাত্র সম্পদ বা প্রতিরক্ষামূলক ব্যতিক্রম ছোঁড়া ব্যবহারের বিপরীতে)?
কারসন 63000

@ কারসন 000৩০০০ ডকুমেন্টেশনটি মনোযোগ সহকারে পড়ুন এবং আপনি দেখতে পাবেন যে স্ট্যাটিক চেকার কেবলমাত্র প্রচুর এবং সতর্কতাগুলির বহিঃপ্রকাশ আনবে, সবচেয়ে অপ্রয়োজনীয়, (বিকাশকারীরা এটি হ'ল এটি স্বীকার করে) এবং সর্বাধিক সংজ্ঞায়িত চুক্তি কেবল একটি ব্যতিক্রম ছুঁড়ে ফেলবে এবং এ ছাড়া কিছুই করবে না ।
ফ্যালকন

@ ফ্যালকন: আশ্চর্যের বিষয় হল, আমার অভিজ্ঞতা সম্পূর্ণ আলাদা। স্থির বিশ্লেষণ ত্রুটিহীনভাবে কাজ করে না, তবে বেশ ভাল, এবং সতর্কতা স্তর 4 (সর্বোচ্চ) এ কাজ করার পরেও আমি খুব কমই অপ্রয়োজনীয় সতর্কতা দেখতে পাই see
আর্সেনী মোরজেনকো

আমার ধারণা এটি কীভাবে আচরণ করে তা জানার জন্য আমাকে এটি চেষ্টা করতে হবে।
ফ্যালকন

উত্তর:


42

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

তবে মৌলিক যুক্তি হ'ল সংকলন সময়ে সমস্যাগুলি সমাধান এবং সমাধানের সম্ভাবনা যা অন্যথায় উত্পাদনে চলে যেতে পারে।

চুক্তি বনাম গার্ডস

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

ইউনিট পরীক্ষা বনাম চুক্তি

এটির মধ্যে সাধারণ যুক্তি হ'ল পরীক্ষাগুলি বাগের উপস্থিতি প্রমাণ করে, যখন প্রকারের (চুক্তিগুলি) অনুপস্থিতিকে প্রমাণ করে। F.ex. এমন একটি প্রকারের সাহায্যে আপনি জানেন যে প্রোগ্রামের কোনও পাথই অবৈধ ইনপুট সরবরাহ করতে পারে না, যখন একটি পরীক্ষা কেবল আপনাকে বলতে পারে যে আচ্ছাদিত পথটি সঠিক ইনপুট সরবরাহ করেছিল।

চুক্তি বনাম নাল অবজেক্ট প্যাটার্ন

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

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

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

সেই চুক্তির উপরেও আপনাকে শূন্যের বাইরে জিনিসগুলি লক্ষ্য করার নমনীয়তা দেয়। সুতরাং আপনি যদি আপনার বাগগুলিতে আর কোনও এনআরই না দেখেন তবে আপনি সম্ভবত পরবর্তী সাধারণ সমস্যাটি শ্বাসরোধ করতে চুক্তি ব্যবহার করতে চাইতে পারেন। এক সাথে বন্ধ? সীমার বাইরে সূচি?

কিন্তু ...

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


6
এটি প্রোগ্রামারদের উপর একটি দুর্দান্ত প্রথম উত্তর। সম্প্রদায়টিতে আপনার অংশগ্রহণে আনন্দিত।

13

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

সুতরাং এখানে এটি প্রথম সুবিধা:

সুবিধা 1: স্থির বিশ্লেষণ

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

উপকার 2: সর্বদা আপ ডেট ডকুমেন্টেশন সাজান

কোড চুক্তিগুলি এক ধরণের ডকুমেন্টেশন সরবরাহ করে যা সর্বদা আপ টু ডেট থাকে। যদি পদ্ধতির এক্সএমএল মন্তব্যটি SetProductPrice(int newPrice)বলে যে newPriceএটি শূন্যের চেয়ে উচ্চতর বা সমান হওয়া উচিত, আপনি আশা করতে পারেন যে ডকুমেন্টেশনটি আপ টু ডেট রয়েছে তবে আপনি এটি আবিষ্কার করতে পারেন যে কেউ পদ্ধতিটি পরিবর্তন করেছে যাতে newPrice = 0একটি নিক্ষেপ করেArgumentOutOfRangeException , তবে সংশ্লিষ্ট ডকুমেন্টেশনগুলি কখনও পরিবর্তন করেনি। কোড চুক্তি এবং কোডের মধ্যেই পারস্পরিক সম্পর্ক সম্পর্কিত, আপনার সিঙ্কের বাইরে থাকা ডকুমেন্টেশন সমস্যা নেই।

কোড চুক্তি দ্বারা সরবরাহিত ডকুমেন্টেশনগুলি এমনভাবে মূল্যবানও হয় যে প্রায়শই, এক্সএমএল মন্তব্যগুলি গ্রহণযোগ্য মানগুলি ভালভাবে ব্যাখ্যা করে না। কতবার আমি হতাশ যদি ছিল nullবা string.Emptyবা \r\nএকটি পদ্ধতি জন্য একজন অনুমোদিত মান, এবং XML মন্তব্য যে নীরব ছিল!

উপসংহারে, কোড চুক্তি ব্যতীত প্রচুর কোডের টুকরো এরকম:

আমি কিছু মানগুলি গ্রহণ করব তবে অন্য নয়, তবে আপনাকে যদি ডকুমেন্টেশন অনুমান করতে বা পড়তে হবে তবে তা যদি থাকে। আসলে, ডকুমেন্টেশন পড়বেন না: এটি পুরানো। কেবল সমস্ত মানগুলি লুপ করুন এবং আপনি সেগুলি দেখতে পাবেন যা আমাকে ব্যতিক্রম ছুঁড়ে ফেলেছে। আপনাকে যে মানগুলি ফিরিয়ে দেওয়া হতে পারে তার পরিসীমাও অনুমান করতে হবে, কারণ আমি তাদের সম্পর্কে আপনাকে আরও কিছু বলি, যদিও এটি সত্য নাও হতে পারে, গত কয়েক বছর ধরে আমাকে করা শত শত পরিবর্তনগুলি।

কোড চুক্তিগুলির সাথে এটি হয়ে যায়:

শিরোনাম আর্গুমেন্ট 0..500 দৈর্ঘ্য সহ একটি নন-নাল স্ট্রিং হতে পারে। পূর্বে পূর্ণসংখ্যাটি একটি ধনাত্মক মান, যা স্ট্রিং ফাঁকা থাকলেই শূন্য হতে পারে। অবশেষে, আমি কোনও IDefinitionবস্তু ফিরিয়ে দেব , কখনই শূন্য নয়।

সুবিধা 3: ইন্টারফেসের চুক্তি

তৃতীয় সুবিধা হ'ল কোড চুক্তিগুলি ইন্টারফেসকে শক্তিশালী করে। আসুন বলি যে আপনার মতো কিছু রয়েছে:

public interface ICommittable
{
    public ICollection<AtomicChange> PendingChanges { get; }

    public void CommitChanges();

    ...
}

আপনি কীভাবে কেবলমাত্র দৃser়পদ এবং ব্যাতিক্রমগুলি ব্যবহার করে গ্যারান্টিটি খালি না CommitChangesহলে কেবল কল করা যেতে পারে PendingChanges? আপনি PendingChangesকখনই গ্যারান্টি দিবেন যে কখনই নয় null?

সুবিধা 4: একটি পদ্ধতির ফলাফল কার্যকর করুন

অবশেষে, চতুর্থ সুবিধাটি Contract.Ensureফলাফলের পক্ষে সক্ষম হবেন । যদি কোনও পদ্ধতিটি যখন পূর্ণসংখ্যাকে ফেরত দেয়, তখন আমি নিশ্চিত হতে চাই যে মানটি কখনই নিকৃষ্ট বা শূন্যের সমান নয়? পাঁচ বছর পরে, প্রচুর বিকাশকারীদের প্রচুর পরিবর্তন সহ্য করার পরে? যত তাড়াতাড়ি কোনও পদ্ধতিতে একাধিক রিটার্ন পয়েন্ট থাকে, Assertএর জন্য এটি একটি রক্ষণাবেক্ষণের দুঃস্বপ্ন হয়ে যায়।


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

ডায়নামিক টাইপিং এবং স্ট্যাটিক টাইপিংয়ের মধ্যে পার্থক্য সাধারণ প্রোগ্রামিং এবং প্রোগ্রামিং এর মাধ্যমে চুক্তির মাধ্যমে পার্থক্যটির খুব কাছাকাছি।


3

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

চুক্তিগুলি পদ্ধতির বাইরে পরীক্ষা করা হয়

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

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

আপনার যদি একটি চুক্তি সুরক্ষিত পদ্ধতি থাকে যা অনেক জায়গার জন্য ডাকা হয় তবে এটি আসল উপকার হতে পারে।


2

দুটি জিনিস সত্যিই:

  1. সরঞ্জাম সমর্থন, ভিএস বুদ্ধি ছাড়াই চুক্তির ডেটা তৈরি করতে পারে যাতে এটি স্বয়ংক্রিয় সম্পূর্ণ সহায়তার অংশ part
  2. যখন একটি সাবক্লাস কোনও পদ্ধতিকে ওভাররাইড করে আপনি নিজের সমস্ত চেকগুলি (যে আপনি এখনও এলএসপি অনুসরণ করেন তা বৈধ হওয়া উচিত) তারা তাদের শিশু ক্লাসগুলি স্বয়ংক্রিয়ভাবে অনুসরণ করে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.