আপনার ব্যক্তিগত সম্পত্তি করা উচিত?


19
private string mWhatever;

private string Whatever
{
    get
    {
        return this.mWhatever;
    }
    set
    {
        this.mWhatever = value;
    }
}

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

উত্তর:


17

সংক্ষিপ্ত উত্তর: হ্যাঁ , যখন প্রয়োজন হয়। অন্যথায়, অটো-ইমপ্লিমেন্টেড প্রপার্টি গেটর এবং সেটারের মতো ব্যবহার করুনprivate string Whatever { get; set;}

  • আপনি খুব কাছাকাছি ডোমেন পদ্ধতির ব্যবহার করার সময় এটি খুব সহজ
  • আপনি যখন মূল্য নির্ধারণ করছেন তখন একটি নির্দিষ্ট যুক্তি পরীক্ষা করা উচিত এটিও সহজ

আপনি কখন ব্যক্তিগত সেটার ব্যবহার করবেন তার পুরো বিবরণ এখানে রয়েছে: সি # সম্পত্তি ব্যবহার


প্রয়োজনে সম্পত্তি পরে জনসম্মুখে করা সত্যিই সহজ।
টম পিকলস

4
একটি ঘনিষ্ঠ ডোমেন পদ্ধতির কি?
ট্রাইপড

1
আমি ক্লাসের একটি সম্পত্তি একটি বেসরকারী সেটটার উল্লেখ ছিল। এটি অবজেক্ট থেকে মান সেট করতে সরাসরি অ্যাক্সেস রোধ করা উচিত এবং মান নির্ধারণের আগে কিছু যুক্তিযুক্ত চেকের সুবিধার্থে।
ইউসুবভ

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

12

এখানে ইতিমধ্যে কয়েকটি ভাল উত্তর রয়েছে তবে আমি মনে করি তাদের বেশিরভাগই আপনার প্রশ্নের একটি পয়েন্ট মিস করে:

আমি কিছু লোককে দেখেছি যারা প্রতিটি একক সদস্যের জন্য সম্পত্তি তৈরি করে, ব্যক্তিগত বা না ... এটি কি কোনও বোঝায়?

আমি মনে করি এটি প্রতিটি সদস্যের জন্য আগেই খুব কম প্রয়োজন । শুরু করা

 private string Whatever;

আপনি যখন পরে এমন কোনও জায়গায় পৌঁছে যান যেখানে আপনাকে এই নির্দিষ্ট সদস্যের জন্য এনক্যাপসুলেশন বা শর্তসাপেক্ষ ব্রেকআপপয়েন্টের প্রয়োজন হয় , আপনি এখনও একই নাম দিয়ে কোনও সম্পত্তি দ্বারা এটি প্রতিস্থাপন করতে পারেন - বেশিরভাগ ক্ষেত্রে কোড ব্যবহার না করেই পরিবর্তন করে Whatever। তবে সাবধান থাকুন, সূক্ষ্ম পার্থক্য রয়েছে, এই এসও পোস্টে ব্রায়ান রাসমুসেনের উত্তর দেখুন (ইমাদ কারিমের দেওয়া লিঙ্ক, +1)।


+1, এছাড়াও, আপনি সঠিক, বেশিরভাগ উত্তর আসল প্রশ্ন পয়েন্টগুলি মিস করল, আমরা সাধারণত এটি আইটি ছেলেরা :)
NoChance

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

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

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

7

এই পদ্ধতির বৃহত্তম সুবিধাগুলির মধ্যে একটি হ'ল আপনার ভেরিয়েবলগুলি পরিবর্তিত হলে আপনি নিয়ন্ত্রণ পান ।

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

সম্পত্তি সহ, আপনি একটি সেটারে একটি ব্রেকপয়েন্ট স্থাপন করতে পারেন । শর্তের সাথে একত্রিত হয়ে, এটি একক রানে পেরেক দেওয়া হতে পারে।

ভিসি ++ এর ডেটা ব্রেকপয়েন্ট রয়েছে তবে এটি কেবল পরিচালনা করা কোডের জন্য উপলব্ধ।


1

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


1

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


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

private string Whatever { get; set; };

এটি খাটো, ক্লিনার এবং আরও অনেক বেশি পাঠযোগ্য। আসলে এটি ব্যাকিং ভেরিয়েবল ঘোষণার চেয়ে সবে দীর্ঘতর।

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


যেমনটি হ'ল, আমি সর্বদা ভেবেছিলাম এটি একটি লজ্জাজনক বিষয় যে আপনার কেবলমাত্র পঠিত সম্পত্তি থাকতে পারে না, কেবল কনস্ট্রাক্টরের মানটিতে লিখতে সক্ষম হবার জন্য, (আমি অপরিবর্তনীয় ধরণের পছন্দ করি ) তবে এটি সি # 6.0 তে যুক্ত করা হয়েছিল "অটো-প্রপার্টি প্রারম্ভিকগণ", যা আপনাকে এটি করতে দেয়:

private string Whatever { get; } = ...;

অথবা

private string Whatever { get; };

সাথে

    Whatever = ...;

কনস্ট্রাক্টর মধ্যে।


0

এটি ব্যক্তিগত সম্পত্তিগুলির জন্য এটি করা একেবারেই প্রয়োজনীয় নয়, তবে এটি কীভাবে অ্যাক্সেস হয় তা পরিবর্তন না করে সম্পত্তি কীভাবে / অন্তর্নিহিত মান সেট করে তা পরিবর্তনের অনুমতি দেয়।

উদাহরণস্বরূপ, অন্তর্নিহিত মানটি কীভাবে সেট করা হয়েছে তা সংশোধন করে:

private string Whatever
{
    get
    {
        return this.mWhatever;
    }
    set
    {
        this.mWhatever = string.IsNullOrEmpty(value) ? string.Empty : value;
    }
}

0

হাঁ

আমি ব্যক্তিগতভাবে এটিকে ক্যাচিং প্রক্রিয়া হিসাবে ব্যবহার করি এবং আমরা এটিকে সম্পত্তি-স্তরের ক্যাচিং বলতে পারি

private List<User> users;
private List<User> Users
{
    get
    {
        if(users == null) users = new UserManager().GetUsers();
        return users;
    }
}

এখন আমার ক্লাসের অন্য জায়গাগুলিতে আমি ক্ষেত্রের Usersপরিবর্তে সম্পত্তি ব্যবহার করি users

আর কোনও সম্ভাব্য পরিস্থিতি তখন হতে পারে যখন আপনি কোনও ক্ষেত্রটিতে কিছু যুক্তি প্রয়োগ করতে চান তবে একটি শ্রেণিতে কেন্দ্রীভূত উপায়ে। সুতরাং আপনি উভয় একটি GetFoo()পদ্ধতি, বা ক্ষেত্রের Fooজন্য সম্পত্তি তৈরি করতে পারেন foo

private string foo;
private string Foo
{
    get
    {
        return "Mr. " + foo;
    }
}

0

আর কিছু বিবেচনা করুন:

প্রকৃত বৈশিষ্ট্য একটি বাস্তবায়ন বিশদ। ওওপি এর অন্যতম লক্ষ্য হ'ল বাস্তবায়নের বিশদটি যেখানে বাস্তবসম্মত তা প্রকাশের চেষ্টা এবং হ্রাস করা।

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

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

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


0

আমি জানি এটি একটি পুরানো প্রশ্ন এবং @ ইউসুবভ যা বলেছেন তা সবই সঠিক, তবে সেটারে নির্দিষ্ট যুক্তির বিষয়ে তাঁর দ্বিতীয় বুলেট পয়েন্টের বিষয়ে এবং যেহেতু আমি কাউকে বিশেষভাবে এটি উল্লেখ করতে দেখিনি, তাই একটি নিখুঁত উদাহরণ হবে যখন আপনার শ্রেণি INotifyPropertyChangedইন্টারফেস প্রয়োগ করে ।

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

public class Settings : INotifyPropertyChanged
{
    public Settings() 
    { 
        this.CountryField = String.Empty; 
    }

    private string CountryField;
    public string Country
    {
        get { return this.CountryField; }
        set
        {
            if (Object.ReferenceEquals(this.CountryField, value)) { return; }

            this.CountryField = value;
            this.RaisePropertyChanged("Country");
        } 
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler propertyChanged = this.PropertyChanged;

        if (propertyChanged != null)
            propertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.