রাকুতে বেসরকারী এবং সর্বজনীন বৈশিষ্ট্য এবং আনুষাঙ্গিকগুলি মিশ্রণ


12
#Private attribute example
class C { 
    has $!w;                            #private attribute
    multi method w { $!w }              #getter method
    multi method w ( $_ ) {                 #setter method
        warn “Don’t go changing my w!”;   #some side action
        $!w = $_
    }  
}
my $c = C.new
$c.w( 42 )
say $c.w #prints 42
$c.w: 43
say $c.w #prints 43

#but not
$c.w = 44
Cannot modify an immutable Int (43)

এতদূর, এত যুক্তিসঙ্গত এবং তারপরে

#Public attribute example
class C { 
    has $.v is rw    #public attribute with automatic accessors
}
my $c = C.new
$c.v = 42
say $c.v #prints 42

#but not
$c.v( 43 ) #or $c.v: 43
Too many positionals passed; expected 1 argument but got 2

আমি '=' অ্যাসাইনমেন্টের অনাস্থা পছন্দ করি, তবে একাধিক পদ্ধতিতে প্রদত্ত পক্ষগুলির ক্রিয়াকলাপগুলিতে আমার সাধ্যের সহজ হওয়া দরকার। আমি বুঝতে পারি যে এটি দুটি পৃথক বিশ্ব এবং এগুলি মেশে না।

তবে - আমি কেন পাবলিক অ্যাট্রিবিউট সেট করতে $ সিভি (43) যেতে পারি না তা আমি বুঝতে পারি না

  1. আমি অনুভব করি যে রাকু আমাকে এই দুটি পদ্ধতির সাথে মিশ্রিত করতে নির্দেশনা দিচ্ছেন - কিছু বৈশিষ্ট্য ব্যক্তিগত এবং কিছু জনসাধারণ এবং যে চাপটি পদ্ধতি পদ্ধতির দিকে (কিছুটি: কোলন থেকে চিনি) - এটি কি রাকুর ডিজাইনের উদ্দেশ্য?
  2. আমি কিছু অনুপস্থিত করছি?

আপনি একটি প্রক্সি ব্যবহার করতে পারেন
user0721090601

আপনি কীভাবে একটি প্রক্সি ব্যবহার করতে পারেন? আমার অর্থ, অ্যাক্সেসর is rwনির্দিষ্ট করা অবস্থায় ইতিমধ্যে একটি ধারক ফেরত দেয়। একটি প্রক্সি ফিরিয়ে দেওয়া অ্যাক্সেসরের অনুমতিযোগ্য প্যারামিটারগুলির সংখ্যা পরিবর্তন করতে যাচ্ছে না।
এলিজাবেথ ম্যাটিজসেন

@ এলিজাবেথমাত্তিজেন সম্ভবত আমি প্রশ্নটি ভুল বুঝেছি। কিন্তু এই কি সে চায় জন্য (উভয় সক্রিয় কাজ বলে মনে হয় = fooএবং .(foo): সেট করার জন্য) এবং পার্শ্ব প্রতিক্রিয়া সক্রিয় উভয় ক্ষেত্রেই কাজ করতে হবে (কিন্তু যখন না শুধুমাত্র সংগৃহীত) tio.run/...
user0721090601

উত্তর:


13

এটাই কি রাকুর ডিজাইনের উদ্দেশ্য?

এটা বলা ঠিক যে রাকু পুরোপুরি এই অঞ্চলে অপরিবর্তিত নয়। আপনার প্রশ্নটি রাকুর ডিজাইনের দুটি থিমগুলিকে স্পর্শ করে, যা উভয়ই একটু আলোচনার জন্য।

রাকুর প্রথম-শ্রেণীর এল-মান রয়েছে

রাকু প্রথম-শ্রেণীর জিনিস হিসাবে এল-ভ্যালুগুলির প্রচুর ব্যবহার করে। আমরা যখন লিখি:

has $.x is rw;

উত্পাদিত পদ্ধতিটি হ'ল:

method x() is rw { $!x }

is rwএখানে ইঙ্গিত করে যে পদ্ধতি একটি ফিরে আসছে L-মান - যে, এমন কিছু বিষয় যা নির্ধারিত করা যেতে পারে। এইভাবে আমরা যখন লিখি:

$obj.x = 42;

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

my $target := $obj.x;
$target = 42;

অবজেক্ট বৈশিষ্ট্য বরাদ্দ করা হবে। এই একই প্রক্রিয়াটি তালিকা নিয়োগ সহ আরও অসংখ্য বৈশিষ্ট্যের পিছনে রয়েছে। উদাহরণস্বরূপ, এটি:

($x, $y) = "foo", "bar";

Listকনটেইনার $xএবং একটি কাজ করে $yএবং তারপরে এই ক্ষেত্রে অ্যাসাইনমেন্ট অপারেটরটি অ্যাসাইনমেন্টটি করার জন্য প্রতিটি পাশের জোড়ায় পুনরাবৃত্তি করে। এর অর্থ আমরা rwসেখানে অবজেক্ট অ্যাকসেসরগুলি ব্যবহার করতে পারি :

($obj.x, $obj.y) = "foo", "bar";

এবং এটি সব ঠিক প্রাকৃতিকভাবে কাজ করে। অ্যারে এবং হ্যাশগুলির টুকরাগুলিকে বরাদ্দ দেওয়ার পিছনেও এই প্রক্রিয়া।

Proxyএল-ভ্যালু কনটেইনার তৈরি করতে কেউ এটি ব্যবহার করতে পারে যেখানে এটি পড়ার এবং লেখার আচরণ আপনার নিয়ন্ত্রণে রয়েছে। এইভাবে, আপনি পার্শ্ব-ক্রিয়াগুলি এতে প্রবেশ করতে পারেন STORE। যাহোক...

রাকু "সেটটার" এর চেয়ে বেশি অর্থোত্তর পদ্ধতি উত্সাহিত করে

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

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

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

  • ডিফল্ট অবজেক্ট ইনিশিয়ালাইজিক লজিক (যেটি একটি class Point { has $.x; has $.y; }হিসাবে ইনস্ট্যান্ট করা যেতে পারে Point.new(x => 1, y => 2)) দ্বারা অ্যাট্রিবিউটটিকে সেট করাতে পছন্দ করে এবং .rakuডাম্পিং পদ্ধতিতে এটি রেন্ডার করে ।
  • ডিফল্ট .Captureঅবজেক্টে অ্যাট্রিবিউটটি বেছে নেয় , এর অর্থ আমরা এটি ডেস্ট্রাকচারিংয়ে (উদাহরণস্বরূপ sub translated(Point (:$x, :$y)) { ... }) ব্যবহার করতে পারি ।

আপনি যদি আরও প্রক্রিয়াগত বা কার্যকরী শৈলীতে লিখতে এবং classরেকর্ডের ধরণের সংজ্ঞা দেওয়ার জন্য একটি উপায় হিসাবে ব্যবহার করছিলেন তবে আপনি কী চাইবেন ?

রাকু ডিজাইনটি সেটারগুলিতে চতুর জিনিসগুলি করার জন্য অনুকূল নয়, কারণ এটি অপ্টিমাইজ করা একটি দরিদ্র বিষয় হিসাবে বিবেচিত হয়। এটি রেকর্ড টাইপের জন্য যা প্রয়োজন তা অতিক্রম করে; কিছু ভাষায় আমরা তর্ক করতে পারি যে আমরা কী বরাদ্দ করা হচ্ছে তার বৈধতা চাই, তবে রাকুতে আমরা এর জন্য subsetপ্রকারগুলিতে যেতে পারি । একই সময়ে, আমরা যদি সত্যিই ওও ডিজাইনটি করি, তবে আমরা রাষ্ট্রীয় মডেলকে আড়াল করে এমন অর্থপূর্ণ আচরণের একটি এপিআই চাই, যাঁরা গেট / সেটারদের ক্ষেত্রে চিন্তাভাবনা করার পরিবর্তে কলোকের ব্যর্থতার দিকে ঝুঁকে পড়ে tend ডেটা এবং আচরণ, যা যাইহোক OO করার মূল বিষয়।


এসগুলিকে সাবধান করার পক্ষে ভাল বক্তব্য Proxy(যদিও আমি এটি হ'র প্রস্তাব দিয়েছি)। শুধুমাত্র সময় আমি তাদের ভয়ঙ্কর দরকারী পেয়েছি আমার জন্য LanguageTag। অভ্যন্তরীণভাবে, $tag.regionপ্রকারের একটি বস্তু ফেরৎ Region(যেমন অভ্যন্তরীণভাবে সঞ্চিত), কিন্তু বাস্তবতা, এটি আরও অসীম সুবিধাজনক মানুষ বলার জন্য $tag.region = "JP"বেশি $tag.region.code = "JP"। এবং এটি প্রকৃতপক্ষে কেবলমাত্র অস্থায়ী, যতক্ষণ না আমি Strটাইপ থেকে জোর করে প্রকাশ করতে পারি , উদাহরণস্বরূপ has Region(Str) $.region is rw(যা দুটি পৃথক পরিকল্পিত তবে স্বল্প অগ্রাধিকারের বৈশিষ্ট্যগুলির প্রয়োজন)
user0721090601

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

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

7

তবে - আমি কেন পাবলিক অ্যাট্রিবিউট সেট করতে $ সিভি (43) যেতে পারি না তা আমি বুঝতে পারি না

ঠিক আছে, এটি বাস্তবে স্থপতি। তবে সিরিয়াসলি, না, রাকু যে স্ট্যান্ডার্ড পদ্ধতিতে কাজ করে তা কেবল এটি নয়।

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

আপনি যদি মডিউল স্পেসে এমন বৈশিষ্ট্য প্রয়োগ করতে আগ্রহী হন তবে দয়া করে আমার সাথে যোগাযোগ করুন।


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

6

আমার সন্দেহ হয় আপনি সবেমাত্র বিভ্রান্ত হয়ে পড়েছেন। 1 আমি এটি স্পর্শ করার আগে, যা সম্পর্কে আপনি বিভ্রান্ত হন না তা দিয়ে শুরু করা যাক:

আমি =কার্যনির্বাহীকরণের অনড়তা পছন্দ করি, তবে মাল্টি পদ্ধতিগুলি যে পক্ষগুলি সরবরাহ করে সেগুলিতে আমার ঘাটানো স্বাচ্ছন্দ্য প্রয়োজন। ... আমি কেন $c.v( 43 )পাবলিক অ্যাট্রিবিউট সেট করতে যেতে পারি না তা বুঝতে পারছি না

আপনি এই সমস্ত জিনিস করতে পারেন । এর অর্থ হ'ল আপনি =অ্যাসাইনমেন্ট এবং একাধিক পদ্ধতি ব্যবহার $c.v( 43 )করেন এবং আপনি যদি চান তবে একই সাথে সমস্ত কিছু " কেবল যান ":

class C {
  has $!v;
  multi method v                is rw {                  $!v }
  multi method v ( :$trace! )   is rw { say 'trace';     $!v }
  multi method v ( $new-value )       { say 'new-value'; $!v = $new-value }
}
my $c = C.new;
$c.v = 41;
say $c.v;            # 41
$c.v(:trace) = 42;   # trace
say $c.v;            # 42
$c.v(43);            # new-value
say $c.v;            # 43

বিভ্রান্তির সম্ভাব্য উত্স 1

পর্দার আড়ালে, has $.foo is rwএর লাইন বরাবর একটি বৈশিষ্ট্য এবং একটি একক পদ্ধতি উত্পন্ন করে:

has $!foo;
method foo () is rw { $!foo }

উপরেরটি যদিও ঠিক ঠিক নয়। আমরা যে আচরণটি দেখছি তা দেখে সংকলকটির স্বয়ংক্রিয়ভাবে উত্পন্ন fooপদ্ধতিটি কোনওভাবে এমনভাবে ঘোষিত হচ্ছে যে একই নামের কোনও নতুন পদ্ধতি নীরবে এটিকে ছায়া দেয়। 2

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

পাদটিকা

1 বেসরকারী বনাম পাবলিক গেটার / সেটেটর সম্পর্কে রাকুর মতামতের একটি পরিষ্কার, পুঙ্খানুপুঙ্খভাবে, অনুমোদনের অ্যাকাউন্টিংয়ের জন্য jnthn এর উত্তর দেখুন এবং যখন আপনি পাবলিক গেটার / সেটটারগুলি ঘোষণা করেন (যেমন লিখুন has $.foo) তখন পর্দার অন্তরালে কী ঘটে ।

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


আহা - ধন্যবাদ @ রাইফ - এটাই আমার অনুভূতিটি অনুপস্থিত ছিল। এখন এটি বোধগম্য হয়। প্রতি জান্টন আমি সম্ভবত আরও ভাল সত্য ওও কোডার হওয়ার চেষ্টা করব এবং খাঁটি ডেটা পাত্রে সেটার স্টাইল রাখব। তবে এটি জেনে রাখা ভাল যে এটি সরঞ্জামবাক্সে রয়েছে!
পি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.