sanjay - ruby stone




কেন রুবি এর attr_accessor, attr_reader এবং attr_writer ব্যবহার করবেন? (4)

অ্যাক্সেসকারীরা পরিবর্তনশীল অ্যাক্সেসকে সীমিত করে তবে তাদের সামগ্রীটি বোঝার জন্য এটি গুরুত্বপূর্ণ। রুবিতে, অন্য কোনও OO ভাষাগুলির মতো, প্রতিটি পরিবর্তনশীল একটি দৃষ্টান্তের একটি পয়েন্টার। সুতরাং যদি আপনার হ্যাশে একটি বৈশিষ্ট্য থাকে, উদাহরণস্বরূপ, এবং আপনি সেটিকে "শুধুমাত্র পঠনযোগ্য" হিসাবে সেট করেন তবে আপনি সর্বদা তার সামগ্রী পরিবর্তন করতে পারেন তবে পয়েন্টারের সামগ্রীটি নয়। এটা দেখ:

irb(main):024:0> class A
irb(main):025:1> attr_reader :a
irb(main):026:1> def initialize
irb(main):027:2> @a = {a:1, b:2}
irb(main):028:2> end
irb(main):029:1> end
=> :initialize
irb(main):030:0> a = A.new
=> #<A:0x007ffc5a10fe88 @a={:a=>1, :b=>2}>
irb(main):031:0> a.a
=> {:a=>1, :b=>2}
irb(main):032:0> a.a.delete(:b)
=> 2
irb(main):033:0> a.a
=> {:a=>1}
irb(main):034:0> a.a = {}
NoMethodError: undefined method `a=' for #<A:0x007ffc5a10fe88 @a={:a=>1}>
        from (irb):34
        from /usr/local/bin/irb:11:in `<main>'

আপনি দেখতে পারেন যে সম্ভব হ্যাস @ ​​এ থেকে একটি কী / মান জোড়া যুক্ত করুন, নতুন কী যুক্ত করুন, মান পরিবর্তন করুন, eccetera। কিন্তু আপনি একটি নতুন বস্তুর দিকে নির্দেশ করতে পারবেন না কারণ শুধুমাত্র একটি পাঠযোগ্য উদাহরণ পরিবর্তনশীল।

রুবি যেমন কী ব্যবহার করে ইনস্ট্যান্স ভেরিয়েবল শেয়ার করার জন্য এই সহজ এবং সুবিধাজনক উপায় আছে

attr_accessor :var
attr_reader :var
attr_writer :var

আমি যদি attr_accessor ব্যবহার করতে পারি তবে কেন আমি attr_reader বা attr_writer নির্বাচন attr_accessor ? কর্মক্ষমতা মত কিছু আছে (যা আমি সন্দেহ)? আমি একটি কারণ আছে অনুমান, অন্যথায় তারা যেমন কি তৈরি করা হবে না।


আপনি আপনার কোডটি পড়ার জন্য আপনার অভিপ্রায়কে যোগাযোগ করার জন্য বিভিন্ন অ্যাক্সেসারগুলি ব্যবহার করতে পারেন এবং ক্লাসগুলি লেখার পক্ষে আরও সহজ করে তুলতে পারেন যা সঠিকভাবে কাজ করবে তাদের তথ্যে কীভাবে তাদের সার্বজনীন API বলা হয়।

class Person
  attr_accessor :age
  ...
end

এখানে, আমি দেখতে পারি যে আমি বয়স পড়তে ও লিখতে পারি।

class Person
  attr_reader :age
  ...
end

এখানে, আমি দেখতে পারি যে আমি কেবল বয়স পড়তে পারি। কল্পনা করুন যে এটি এই বর্গটির কন্সট্রাকটর দ্বারা সেট করা হয়েছে এবং এর পরেই এটি স্থির থাকে। বয়সের জন্য কোনও পরিবর্তনকারী (লেখক) ছিল এবং ক্লাসটি লিখিত ছিল যে বয়সটি একবার সেট করা হয় না, তবে কোনও বাগ কোড পরিবর্তনকারীর কোডিংয়ের ফল হতে পারে না।

কিন্তু দৃশ্যের পিছনে কি হচ্ছে?

যদি আপনি লিখুন:

attr_writer :age

যে অনুবাদ করা হয়:

def age=(value)
  @age = value
end

যদি আপনি লিখুন:

attr_reader :age

যে অনুবাদ করা হয়:

def age
  @age
end

যদি আপনি লিখুন:

attr_accessor :age

যে অনুবাদ করা হয়:

def age=(value)
  @age = value
end

def age
  @age
end

এটি সম্পর্কে জানা, এখানে এটি সম্পর্কে আরেকটি উপায় রয়েছে: যদি আপনার Attr _... হেল্পার্স থাকে না এবং অ্যাক্সেসারগুলি নিজের কাছে লিখতে হত তবে আপনি কি আপনার ক্লাসের চাইতে আরও অ্যাক্সেসারগুলি লিখবেন? উদাহরণস্বরূপ, বয়স শুধুমাত্র পড়ার প্রয়োজন হলে, আপনি কি এটি লিখিত হওয়ার অনুমতি দেওয়ার পদ্ধতিও লিখবেন?


উপরের সব উত্তর সঠিক; attr_reader এবং attr_writer এর জন্য লেখার পদ্ধতিগুলি ম্যানুয়াল টাইপ করার চেয়ে আরও বেশি সুবিধাজনক। এছাড়া তারা পদ্ধতি সংজ্ঞা নিজেকে লেখার চেয়ে অনেক ভালো কর্মক্ষমতা প্রস্তাব করে। আরো তথ্যের জন্য স্লাইড 15২ এর পর থেকে এই আলাপ পাতায় ( PDF ) অ্যারন প্যাটারসনের দ্বারা দেখুন।


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

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







ruby