আমি অবশ্যই যুক্তি দিয়ে বলব যে যদি আপনি কোনও সম্পত্তি সেটেটর বা গেটর থেকে ব্যতিক্রম ছুঁড়ে দেওয়ার প্রয়োজন বোধ করেন তবে ডিজাইনের একটি ত্রুটি রয়েছে।
একটি সম্পত্তি বিমূর্ততা যে কিছু যে প্রতিনিধিত্ব করে শুধু একটি মান । এবং এমনটি একটি ব্যতিক্রম ঘটতে পারে এমন ভয়ে আপনার কোনও মান নির্ধারণ করা উচিত *
যদি কোনও পার্শ্ব প্রতিক্রিয়াতে সম্পত্তি ফলাফল নির্ধারণ করা হয়, তবে এটি পরিবর্তে একটি পদ্ধতি হিসাবে প্রয়োগ করা উচিত। এবং যদি এটি কোনও পার্শ্ব প্রতিক্রিয়া তৈরি করে না, তবে কোনও ব্যতিক্রম ছোঁড়া উচিত নয়।
ইতিমধ্যে ভিন্ন উত্তরে উল্লিখিত একটি উদাহরণ হ'ল Stream.Positionসম্পত্তি। এটি পার্শ্ব প্রতিক্রিয়া তৈরি করে এবং ব্যতিক্রম ছুঁড়ে ফেলতে পারে। তবে এই সম্পত্তি সেটারটি মূলত কেবল একটি মোড়কের চারপাশে Stream.Seekযা আপনি পরিবর্তে কল করতে পারেন।
ব্যক্তিগতভাবে, আমি বিশ্বাস করি যে অবস্থানটি কোনও লিখনযোগ্য সম্পত্তি হওয়া উচিত ছিল না।
আর একটি উদাহরণ যেখানে আপনাকে সম্পত্তি সেটটার থেকে একটি ব্যতিক্রম ছুঁড়ে ফেলার প্রলোভন করা যেতে পারে তা হ'ল ডেটা বৈধকরণে:
public class User {
public string Email {
get { return _email; }
set {
if (!IsValidEmail(value)) throw InvalidEmailException(value);
_email = value;
}
}
তবে এই সমস্যার আরও ভাল সমাধান আছে। কোনও বৈধ ইমেল ঠিকানা উপস্থাপন করে এমন একটি প্রকারের পরিচয় দাও:
public class Email {
public Email(string value) {
if (!IsValidEmail(value)) throw new InvalidEmailException(value);
...
}
...
}
public class User {
public Email Email { get; set; }
}
Emailবর্গ নিশ্চিত করে যে এটা যে একটি বৈধ ইমেইল ঠিকানা নয় একটি মান ধরে রাখতে পারেন, এবং ক্লাস দোকান ইমেল করার প্রয়োজনীয়তা তাদের যাচাই দায়িত্ব অব্যাহতি করছে।
এটি উচ্চতর সংহতির দিকেও পরিচালিত করে (ভাল সফ্টওয়্যার ডিজাইনের সূচক) - কোনও ইমেল ঠিকানা কী, এবং এটি কীভাবে বৈধ হয় তা সম্পর্কে জ্ঞান কেবল Emailশ্রেণিতে বিদ্যমান , যার কেবলমাত্র উদ্বেগ রয়েছে।
* অবজেক্টডিস্পোজড এক্সসেপশন হ'ল একমাত্র বৈধ ব্যতিক্রম (কোনও পাং উদ্দেশ্য নয়) আমি এই মুহুর্তে ভাবতে পারি।