আমার ব্যক্তিগত ক্ষেত্রের সাথে বা ছাড়া সম্পত্তিগুলি পছন্দ করা উচিত?


16

আমি এখন যে কোডবেসে কাজ করছি তাতে ব্যক্তিগত ক্ষেত্র এবং সর্বজনীন সম্পত্তি ব্যবহারের প্রচলন রয়েছে। উদাহরণস্বরূপ, বেশিরভাগ ক্লাসে তাদের সদস্যদের এভাবে সংজ্ঞায়িত করা হয়:

// Fields
private double _foo;
private double _bar;
private double _baz;

// Properties
public double Foo
{
    get{ return _foo; }
    set{ _foo = value; }
}

public double Bar
{
    get{ return _bar; }
    set{ _bar = value; }
}

public double Baz
{
    get{ return _baz; }
}

আমি জানি তাদের অভ্যন্তরীণ ব্যক্তিগত সম্পত্তি ব্যতীত এগুলি আবার লেখা যেতে পারে :

public double Foo{ get; set; }
public double Bar{ get; set; }
public double Baz{ get; private set; }

আমি এটিতে কিছু ইনপুট চাই:

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


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

@ কেচালাক্স: বোঝা গেল! এ কারণেই এটি একটি মন্তব্য নয়, উত্তর নয়। :-)
পিটার কে।

@PeterK। মেলা '
নফ

1
পরিবর্তন না করার আরেকটি কারণ হ'ল যদি ডাব্লুসিএফ দিয়ে তারের উপর দিয়ে কিছু করা হয় - স্বয়ংক্রিয় বৈশিষ্ট্যগুলির চুক্তির সমস্যা রয়েছে (। নেট দ্বারা তৈরি ব্যাকিং ফিল্ডের নামগুলিতে অবৈধ অক্ষরের কারণে)
লিওন

উত্তর:


16

কয়েকটি দৃষ্টান্ত রয়েছে যেখানে তথাকথিত "পুরানো" স্টাইলটি এখনও প্রয়োজন:

উত্তর: অপরিবর্তিত প্রকারের ভাষা-সরবরাহিত অপরিবর্তনীয়তা ব্যবহার করে। readonlyC # পরিবর্তক নির্মাণ পর যে মান স্থির। স্বয়ংক্রিয়ভাবে প্রয়োগকৃত বৈশিষ্ট্যগুলি (এখনও) এর সাথে এটি অনুকরণ করার কোনও উপায় নেই।

public sealed class FooBarBazInator
{
    private readonly double foo;

    public FooBarBazInator(double foo)
    {
        this.foo = foo;
    }

    public double Foo
    {
        get
        {
            return this.foo;
        }
    }
}

বি: আপনার গেটার / সেটারদের যা-ই হোক না কেন কোনও যুক্তি রয়েছে। আপনার ক্লাসে ডেটা-বেঁধে থাকা ডাব্লুপিএফ এবং সিলভারলাইট (এবং অনুরূপ) কোডটি এর INotifyPropertyChangedমতো প্রয়োগ করবে :

public class FooBarBazInator : INotifyPropertyChanged
{
    private double foo;

    public event PropertyChangedEventHandler PropertyChanged;

    public double Foo
    {
        get
        {
            return this.foo;
        }

        set
        {
            this.foo = value;
            this.RaisePropertyChanged("Foo");
        }
    }

    private void RaisePropertyChanged(string propertyName)
    {
        var propertyChanged = this.PropertyChanged;

        if (propertyChanged != null)
        {
            propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

এগুলি বাদে আমি বলব নতুন স্টাইলটি ব্যবহার করুন। আপনার কোডটি সংক্ষিপ্ত রাখে এবং বাগগুলিতে ক্রেপ হওয়ার জন্য কম পৃষ্ঠের ক্ষেত্র সরবরাহ করে Plus প্লাস, যদি কখনও যুক্তি অন্তর্ভুক্ত করার জন্য এটি পরিবর্তন করতে হয় তবে এটি স্বাক্ষর-অসম্পূর্ণ হবে না।


2
সবাই মনে হয় নতুন স্টাইলের সাথে যাওয়ার বিষয়ে একমত হয়েছেন। সংশোধকটির সাথে কোনও ক্ষেত্রের প্রয়োজনীয়তা সম্পর্কে আমাকে বলার জন্য আপনি একটি +1 এবং উত্তর ক্রেডিট পান readonly, যা আমি জানতাম না। = ডি
কেচালোক্স

3
কিছু (আমাকে সহ) ব্যক্তিগত অ্যাক্সেসর সহ অটো বৈশিষ্ট্যগুলিকে অপরিবর্তনীয় বৈশিষ্ট্যের জন্য "যথেষ্ট ভাল" মনে করে। সত্য, তারা সত্যই অপরিবর্তনীয় হতে পারে না, তবে আপনাকে কেবল কনস্ট্রাক্টরের বাইরে সেটারটি ব্যবহার না করার বিষয়ে যত্নবান হতে হবে।
সোভিক

2
আর রিওন হ'ল যদি আপনি এমন মানটি পাস করতে চান refযা বৈশিষ্ট্যের সাথে কাজ করে না, তাই আপনার ক্ষেত্রটি দরকার
অগস্ট

1
ফডির মতো একটি সরঞ্জাম INotifyPropertyChangedসুস্পষ্ট সমর্থন ক্ষেত্রের প্রয়োজন ছাড়াই বাস্তবায়ন করতে পারে । github.com/Fody/PropertyChanged
সেবাস্তিয়ান রেডল

3
দ্রষ্টব্য: সি # 6 "গিটার-কেবল অটো-প্রপার্টি" এর জন্য অনুমতি দেয় যা আমার উদাহরণ "এ" কী করছে তা একক লাইনে সরবরাহ করে।
জেসি সি স্লিকার 14

6

আমি বলব যে সুস্পষ্ট ব্যাকিং ফিল্ড থাকা কেবল অকেজো ক্রাফ্ট: এটি আপনার কোডটি দীর্ঘতর এবং আরও শক্ত করে পড়া। এটি ত্রুটির সম্ভাবনাও যুক্ত করে:

public double Bar
{
    get { return _baz; }
    set { _bar = value; }
}

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

এবং যদি আপনি ধারাবাহিকতা চান তবে এটি অন্যভাবে করুন: স্বয়ংক্রিয় বৈশিষ্ট্য ব্যবহার করে এমন ব্যাকিং ক্ষেত্রগুলিকে কোডে পরিবর্তন করুন এমন কোডটি পরিবর্তন করুন। এটি বিশেষত সহজ যদি আপনি রিসার্পারের মতো রিফ্যাক্টরিং সরঞ্জাম ব্যবহার করেন (এবং যদি আপনি এর মতো কিছু ব্যবহার না করেন তবে আমার মনে হয় আপনার শুরু করা উচিত)।

অবশ্যই, এখনও এমন ক্ষেত্রে রয়েছে যেখানে ব্যাকিং ফিল্ড থাকা প্রয়োজনীয়, তবে আমি মনে করি এটি এই প্রশ্নের সাথে প্রাসঙ্গিক নয়।


কোডটি রিফ্যাক্ট করার সময় আমি পুরানো কয়েকটি ক্ষেত্রের মধ্যে আসলে এটি করেছি ... এটি একটি ব্যথা।
কেচালোক্স

1

যদিও প্রশ্নটি বেশ পুরানো তবে আমি এখানে উল্লেখ করার মতো একটি বই থেকে কয়েকটি পয়েন্ট যুক্ত করার কথা ভেবেছিলাম।

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

  2. ডিবাগিং করার সময়, আপনি কোনও এআইপি গেট বা সেট পদ্ধতিতে ব্রেকপয়েন্ট রাখতে পারবেন না, সুতরাং কোনও অ্যাপ্লিকেশন কখন এই সম্পত্তি পাচ্ছে বা সেট করছে তা আপনি সহজেই সনাক্ত করতে পারবেন না। আপনি নিজে প্রয়োগ করা ব্রেকপয়েন্টগুলিতে ব্রেকপয়েন্ট সেট করতে পারেন set


3
# 1 - বেশিরভাগ সিরিয়ালাইজারগুলি ব্যক্তিগত সম্পত্তি / ক্ষেত্রগুলিকে ডিফল্টরূপে উপেক্ষা করে; আপনার উল্লিখিত সমস্যাগুলির আমি কখনও মুখোমুখি হইনি। # 2 - এটি VS2015 এ স্থির করা হয়েছে এবং VS2013 এ প্রায় কাজ করা যেতে পারে। দেখুন এই ভিসুয়াল স্টুডিও ম্যাগাজিন নিবন্ধ
ব্রায়ান

-3

আরও বেশি সংক্ষিপ্ততর থেকে আরও পুরানো, আরও স্পষ্ট শৈলীর পছন্দ করার কোনও যুক্তি আছে কি?

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

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

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



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

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

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

2
ফ্রেমওয়ার্কগুলি এগুলিকে অন্যভাবে পরিচালনা করে: EF পোকোতে একটি সর্বজনীন ক্ষেত্র ব্যবহার করে চেষ্টা করুন, এটি একটি ডেটাগ্রিডভিউয়ের সাথে আবদ্ধ করুন, একটি প্রপার্টিগ্রিড ব্যবহার করুন I কয়েকবার, কিন্তু গেটফিল্ডের কাছে নয়। নীচের লাইন, তারা পৃথক, এবং সর্বদা জনসাধারণের ডেটার জন্য সম্পত্তি ব্যবহার করার পরামর্শটি এই সত্যের উপর ভিত্তি করে। এটি কখনও ক্ষেত্রগুলি ব্যবহার করে বিরত থাকে না, তবে সেই ক্ষেত্রে ন্যায়সঙ্গত হওয়া দরকার। তবে আপনার অন্য বিষয়টি অবশ্যই সত্য, জনসাধারণের ডেটা অযত্নে উদ্ভাসিত করা সর্বদা একটি খারাপ ধারণা।
কেভিন ম্যাককর্মিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.