কেন কেবলমাত্র সেট-আপ সম্পত্তি থাকার পরামর্শ দেওয়া হচ্ছে না?


9

আজ কর্মক্ষেত্রে আমার এক সহকর্মী আমার কোডটি পর্যালোচনা করেছেন, এবং পরামর্শ দিয়েছেন যে আমি একটি সেট-কেবল সম্পত্তি অপসারণ করি এবং পরিবর্তে একটি পদ্ধতি ব্যবহার করি।

যেহেতু আমরা দুজনেই অন্যান্য বিষয়ে ব্যস্ত ছিলাম, তিনি আমাকে Property Design"ফ্রেমওয়ার্ক ডিজাইনের গাইডলাইনস" বইয়ের বিভাগটি দেখুন বলেছিলেন । বইটিতে লেখক এড়াতে কেবল বলেছিলেন:

গিটারের চেয়ে বিস্তৃত অ্যাক্সেসযোগ্যতার সাথে সেটারযুক্ত বৈশিষ্ট্য

এবং এখন আমি ভাবছি কেন কেবলমাত্র সেট-এ সম্পত্তি রাখার পরামর্শ দেওয়া হচ্ছে না? কেউ কি আমার জন্য স্পষ্ট করতে পারেন?


6
আপনি কি এমন পরিস্থিতি বর্ণনা করতে পারবেন যেখানে আপনি ভাবেন যে কেবলমাত্র সেট-আপ সম্পত্তি উপযুক্ত? এটি উত্তরগুলি আরও কিছুটা প্রাসঙ্গিক করে তুলতে পারে।
জনএফএক্স

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

উত্তর:


15

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

মাইক্রোসফ্টের সম্পত্তি ব্যবহারের নির্দেশিকাগুলির একটি সম্পর্কিত বিভাগ এখানে :

বৈশিষ্ট্য বনাম পদ্ধতি

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

  • সদস্য যখন একটি লজিকাল ডেটা সদস্য হয় তখন কোনও সম্পত্তি ব্যবহার করুন। নিম্নলিখিত সদস্য ঘোষণায় Nameএকটি সম্পত্তি কারণ এটি শ্রেণীর একটি যৌক্তিক সদস্য।
public string Name
{
    get 
    {
        return name;
    }
    set 
    {
        name = value;
    }
}

একটি পদ্ধতি ব্যবহার করুন যখন:

  • অপারেশন একটি রূপান্তর, যেমন Object.ToString
  • অপারেশনটি যথেষ্ট ব্যয়বহুল যে আপনি ব্যবহারকারীর সাথে যোগাযোগ করতে চান যে ফলাফলটি ক্যাশে করার বিষয়ে তাদের বিবেচনা করা উচিত।
  • getঅ্যাক্সেসর ব্যবহার করে একটি সম্পত্তি মান অর্জনের একটি পর্যবেক্ষণযোগ্য পার্শ্ব প্রতিক্রিয়া হবে।
  • পর পর দুবার সদস্যকে ফোন করা বিভিন্ন ফলাফলের জন্ম দেয়।
  • মৃত্যুদণ্ড কার্যকর করার আদেশটি গুরুত্বপূর্ণ। নোট করুন যে কোনও প্রকারের বৈশিষ্ট্যগুলি কোনও ক্রমে সেট এবং পুনরুদ্ধার করতে সক্ষম হওয়া উচিত।
  • সদস্য স্থিতিশীল তবে পরিবর্তিত হতে পারে এমন একটি মান ফেরত দেয়।
  • সদস্য একটি অ্যারে ফেরত দেয়। বৈশিষ্ট্যগুলি যে অ্যারে ফিরিয়ে দেয় তা খুব বিভ্রান্তিকর হতে পারে। সাধারণত অভ্যন্তরীণ অ্যারের একটি অনুলিপি ফেরত নেওয়া প্রয়োজন যাতে ব্যবহারকারী অভ্যন্তরীণ স্থিতি পরিবর্তন করতে না পারে। এটির সাহায্যে কোনও ব্যবহারকারী সহজেই ধরে নিতে পারে যে এটি একটি সূচকযুক্ত সম্পত্তি, অযোগ্য কোডের দিকে নিয়ে যায়। নিম্নলিখিত কোড উদাহরণে, পদ্ধতি বৈশিষ্ট্যে প্রতিটি কল অ্যারের অনুলিপি তৈরি করে। ফলস্বরূপ, অ্যারের 2 ^ n + 1 টি অনুলিপি নীচের লুপে তৈরি হবে।
Type type = // Get a type.
for (int i = 0; i < type.Methods.Length; i++)
{
   if (type.Methods[i].Name.Equals ("text"))
   {
      // Perform some operation.
   }
}

[... দীর্ঘতম উদাহরণ এড়ানো ...]

কেবলমাত্র পঠনযোগ্য এবং কেবল লেখার জন্য বৈশিষ্ট্য

আপনি যখন কেবল সম্পত্তিটির লজিকাল ডেটা সদস্যকে পরিবর্তন করতে না পারেন তখন আপনার কেবল পঠনযোগ্য সম্পত্তি ব্যবহার করা উচিত। কেবল লেখার বৈশিষ্ট্য ব্যবহার করবেন না।


হ্যাঁ - নূন্যতম বিস্ময়ের নীতিটি এখানে কাজ করে।
পল কসাই

6

কারণ এটি কেবল বেশিরভাগ ক্ষেত্রেই কোনও ধারণা রাখে না। আপনি কি সম্পত্তি থাকতে পারে যা আপনি সেট করতে পারেন তবে পড়তে পারেন না?

যদি ওও প্রকৃত বিশ্বের আরও ভাল প্রতিনিধিত্ব করে বোঝানো হয় তবে একটি নির্দিষ্ট সম্পত্তি কেবলমাত্র আপনার মডেলিংটি বন্ধ রয়েছে তা বোঝাতে পারে।

সম্পাদনা করুন : আরও দেখুন: /programming/4564928/are-set-only-properties-bad- অনুশীলন যা মূলত বলে দেয় যে এটি অপ্রতিদ্বন্দ্বী এবং একটি সেট শুধুমাত্র সম্পত্তি মূলত অন্য নামে একটি পদ্ধতি যার ফলে আপনার ব্যবহার করা উচিত পদ্ধতি।


1
আমি পূর্বে সেট-কেবল বৈশিষ্ট্যগুলি ব্যবহার করেছি। তারা এর আচরণটি কনফিগার করতে অবজেক্টের একটি ব্যক্তিগত ক্ষেত্রে লিখুন। বাহ্যিক কোডের বর্তমান মান জানার প্রয়োজন না থাকলে এগুলি কার্যকর হয় তবে এটিকে পরিবর্তন করার প্রয়োজন হতে পারে। অবশ্যই এটি বিরল, তবে আমি এটি ঘটতে দেখেছি।
ম্যাসন হুইলারের

@ ম্যাসন - আমি অবশ্যই এতদূর যাব না যে আপনি কখনও এগুলি ব্যবহার করবেন না তবে নিয়মের পরিবর্তে তাদের মূলত ব্যতিক্রম হওয়া উচিত।
জন হপকিন্স

@ ম্যাসনওহেলার এটি প্রায় না Foo Foo { private get; set; }? আমি কেবল এই
লিখনকে

6

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

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


আমি সম্মত, তবে এই ক্ষেত্রে কীভাবে কোনও সেটার পদ্ধতি আলাদা হবে?
ট্র্যাভিস ক্রিশ্চিয়ান

1
@ ট্র্যাভিস খ্রিস্টান: মনে হচ্ছে ওপি এমন পরিস্থিতি নিয়ে কাজ করছে যেখানে সেখানে সেটার থাকলেও কোনও সরবরাহকারী নেই। সুতরাং তারা কিছু সেট করতে পারে তবে এটি পরে পরিবর্তিত হয় কিনা তা তারা কখনই জানতে পারবে না।
হতাশ

@ ফ্রাস্ট্রেটেড তবে তারা কখনও জানতে পারবেন না যে কোনও পদ্ধতিতে আবার কিছু পরিবর্তন করা হয়েছে কিনা।
আদম লিয়ার

@ আনা লিয়ার ♦: যদি কোনও গেটর থাকে তবে আপনি যদি আপনার কোডটিতে একটি পয়েন্ট রেখে থাকেন যেখানে আপনি যে মানটি নির্ধারণ করেছিলেন তা হঠাৎ সন্দেহ হতে পারে তবে আপনি এটি ব্যবহার করার আগে কমপক্ষে মানটি পরীক্ষা করতে পারেন।
হতাশ

3
@ নিরস্ত আমি সম্মত এটি ঠিক যে প্রশ্নটি একই কাজটি করার জন্য কোনও পদ্ধতি ব্যবহার করে একটি সেট-কেবল সম্পত্তি ব্যবহার সম্পর্কে ছিল।
অ্যাডাম লিয়ার

-1

এটি একটি খুব পুরানো বিষয় তবে এটি এই দেরীতে আমার দৃষ্টিতে ঝাঁপিয়ে পড়েছে এবং আমি কেবলমাত্র লেখার বৈশিষ্ট্যগুলির জন্য কেস করার চেষ্টা করার সাথে কিছু মন্তব্য চাই ...

আমার কাছে ActiveReportক্লাসগুলির একটি সেট রয়েছে যা একটি ওয়েবসাইটের অংশ যা ইনস্ট্যান্ট হয় এবং বেশ কয়েকটি ব্যবহারকারী নির্বাচনের পরে পোস্টব্যাকে চালিত হয়।

ভিবি কোডটি এরকম কিছু দেখাচ্ছে:

  Public Class SomeReport
    Private greader As New GenericReporting.CommonReader("AStoredProcedure", 
                                      {New SqlParameter("budget_id", 0)})

    Public WriteOnly Property BudgetID As Integer
      Set(value As Integer)
        greader.Parameters("budget_id").Value = value
      End Set
    End Property

    Public Sub New(Optional budget_id As Integer = 0)
      ' This call is required by the designer.
      InitializeComponent()

      ' Add any initialization after the InitializeComponent() call.
      BudgetID = budget_id
    End Sub
  End Class

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

  '''''''''''''''''''''''
  ' Parameter taken from a user selected row of a GridView
  '
  Dim SomeBudgetID As Integer = gvBudgets.SelectedDataKey.Values(budget_id)

  '''''''''''''''''''''''      
  ' On Instantiation
  '
  Dim R as ActiveReport = New SomeReport(SomeBudgetID)
  R.Run()

  '''''''''''''''''''''''      
  ' Or On Instantiation using "With" syntax
  '
  Dim R as ActiveReport = New SomeReport() With {.BudgetID = SomeBudgetID}
  R.Run()

  '''''''''''''''''''''''
  ' Or After
  '
  Dim R as ActiveReport = New SomeReport()
  R.BudgetID = SomeBudgetID
  R.Run()

সুতরাং, আমি এটি দেখতে পাচ্ছি, এক্ষেত্রে কেবল লেখার সম্পত্তি রয়েছে

  1. SqlParameterজেনারিক ধরণের হিসাবে শক্তিশালী প্রকারের চেকিংয়ের মঞ্জুরি দেয়
  2. প্রতিবেদন তৈরির ক্ষেত্রে আরও নমনীয়তা, সমস্ত প্যারামিটারগুলি উপলভ্য হওয়ার সাথে সাথে পরে যুক্ত করা থাকলে প্রতিবেদনটি তাত্ক্ষণিকভাবে ইনস্ট্যান্ট করা যেতে পারে।
  3. বৈশিষ্ট্যগুলি ইনস্ট্যান্টেশনে "উইথ" সিনট্যাক্স সমর্থন করে
  4. প্যারামিটারগুলি ব্যবহারকারী হিসাবে জানা এবং রিপোর্ট দ্বারা পরিবর্তিত না হওয়ায় একটি "গেটর" কি সত্যিই প্রয়োজনীয়?
  5. যেহেতু SqlParameterগুলি একটি শ্রেণি এবং আদিম মান নয়, WritOnly বৈশিষ্ট্যগুলি পরামিতিগুলি সেট করার জন্য একটি সহজ ইন্টারফেসের অনুমতি দেয়

সুতরাং যে আমার চিন্তা।

আমি কি পরিবর্তে এটি একটি পদ্ধতিতে রূপান্তর করতে পারি? নিশ্চিত তবে ইন্টারফেস মনে হচ্ছে ... কম সুন্দর

  R2.BudgetID = SomeBudgetID

বনাম

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