সম্পত্তি খারাপ ফর্ম থেকে একটি ব্যতিক্রম নিক্ষেপ করা হয়?


15

আমি সর্বদা মানসিকতার মধ্যে থেকেছি যে সম্পত্তি (যেমন তাদের সেট / অপারেশন পেতে) দ্রুত / তাত্ক্ষণিক এবং ব্যর্থতা মুক্ত হওয়া উচিত be সম্পত্তি অর্জন বা সেট করার আশেপাশে আপনাকে কখনই চেষ্টা করতে / ধরতে হবে না।

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

তাই আমি জিজ্ঞাসা: আমি কি ভুল? জিনিস পরিবর্তন হয়েছে? এটি কী স্বীকৃত হয়েছে যে সম্পত্তিগুলি ব্যতিক্রম ছুঁড়ে ফেলতে সক্ষম হবে?


1
স্ট্যাকওভারফ্লোতে এই একই প্রশ্নটি আরও মনোযোগ এবং আরও ভাল উত্তর পেয়েছে।
রোমান স্টারকভ

উত্তর:


14

আপনি যখন কোনও সম্পত্তির মান সেট করেন, কোনও অবৈধ মানের উপর ব্যতিক্রম ছুঁড়ে ফেলা ভাল

কোনও সম্পত্তির মূল্য অর্জন করা (প্রায়) কখনই ব্যতিক্রম হয় না

ভূমিকা-ভিত্তিক অ্যাক্সেসের জন্য, বিভিন্ন / ডাম্বার ইন্টারফেস বা ফ্যাকাস ব্যবহার করুন; লোকেরা তাদের থাকতে পারে না এমন জিনিসগুলি দেখতে দেবে না!


5

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


4

আমি অবশ্যই যুক্তি দিয়ে বলব যে যদি আপনি কোনও সম্পত্তি সেটেটর বা গেটর থেকে ব্যতিক্রম ছুঁড়ে দেওয়ার প্রয়োজন বোধ করেন তবে ডিজাইনের একটি ত্রুটি রয়েছে।

একটি সম্পত্তি বিমূর্ততা যে কিছু যে প্রতিনিধিত্ব করে শুধু একটি মান । এবং এমনটি একটি ব্যতিক্রম ঘটতে পারে এমন ভয়ে আপনার কোনও মান নির্ধারণ করা উচিত *

যদি কোনও পার্শ্ব প্রতিক্রিয়াতে সম্পত্তি ফলাফল নির্ধারণ করা হয়, তবে এটি পরিবর্তে একটি পদ্ধতি হিসাবে প্রয়োগ করা উচিত। এবং যদি এটি কোনও পার্শ্ব প্রতিক্রিয়া তৈরি করে না, তবে কোনও ব্যতিক্রম ছোঁড়া উচিত নয়।

ইতিমধ্যে ভিন্ন উত্তরে উল্লিখিত একটি উদাহরণ হ'ল 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শ্রেণিতে বিদ্যমান , যার কেবলমাত্র উদ্বেগ রয়েছে।

* অবজেক্টডিস্পোজড এক্সসেপশন হ'ল একমাত্র বৈধ ব্যতিক্রম (কোনও পাং উদ্দেশ্য নয়) আমি এই মুহুর্তে ভাবতে পারি।


2

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

থেকে JavaBeans স্পেসিফিকেশন :

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

PropertyType getFoo();
void setFoo(PropertyType value) throws PropertyVetoException;

দয়া করে এই সমস্ত লবণের দানা দিয়ে নিন all জাভাবীনের স্পেসিফিকেশনটি পুরানো, এবং সি # প্রোপার্টিগুলি (আইএমও) জাভাতে থাকা "নামকরণ কনভেনশন" ভিত্তিক বৈশিষ্ট্যের তুলনায় বিশাল উন্নতি। আমি শুধু একটু প্রসঙ্গ দেওয়ার চেষ্টা করছি, সব!


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

2

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

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


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

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

1

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

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


0

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

আমি সাধারণত বলি যেহেতু এমন কিছু সময় হতে পারে যখন আপনি একেবারে, অবশ্যই, পরিণতি সম্পর্কে খুব বেশি চিন্তা না করে কোনও কিছু ব্লক করতে চান। আমার ধারণা সুরক্ষা সেখানে ক্লাসিক কেস হবে।

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