ওয়াফলি শিরোনামের জন্য দুঃখিত - আমি যদি একটি সংক্ষিপ্ত শিরোনাম নিয়ে আসতে পারি তবে আমাকে প্রশ্ন জিজ্ঞাসা করতে হবে না।
ধরুন আমার একটি অপরিবর্তনীয় তালিকার প্রকার আছে। এটির একটি ক্রিয়াকলাপ রয়েছে Foo(x)
যা শেষে অতিরিক্ত উপাদান হিসাবে নির্দিষ্ট যুক্তি সহ একটি নতুন অপরিবর্তনীয় তালিকা প্রদান করে। সুতরাং "হ্যালো", "অপরিবর্তনীয়", "বিশ্ব" মানের সাথে স্ট্রিংগুলির একটি তালিকা তৈরি করতে আপনি লিখতে পারেন:
var empty = new ImmutableList<string>();
var list1 = empty.Foo("Hello");
var list2 = list1.Foo("immutable");
var list3 = list2.Foo("word");
(এটি সি # কোড, এবং আপনি যদি ভাষাটি গুরুত্বপূর্ণ বলে মনে করেন তবে আমি একটি সি # পরামর্শে সর্বাধিক আগ্রহী It's এটি মূলত কোনও ভাষার প্রশ্ন নয়, তবে ভাষার বাক্যাংশটি গুরুত্বপূর্ণ হতে পারে))
গুরুত্বপূর্ণ বিষয় হ'ল বিদ্যমান তালিকাগুলি দ্বারা পরিবর্তন করা হয় নাFoo
- তাই empty.Count
এখনও 0 ফিরে আসবে।
শেষের ফলাফলটিতে পৌঁছানোর আর একটি (আরও মুশকিল) উপায় হ'ল:
var list = new ImmutableList<string>().Foo("Hello")
.Foo("immutable")
.Foo("word");
আমার প্রশ্ন: ফু এর সেরা নামটি কী?
সম্পাদনা 3 : আমি পরে প্রকাশ হিসাবে, টাইপটির নামটি সম্ভবত নাও থাকতে পারে ImmutableList<T>
, যা অবস্থানটি পরিষ্কার করে। পরিবর্তে এটি কল্পনা করুন যে এটি TestSuite
এবং এটি অপরিবর্তনীয় কারণ এটির কাঠামোর পুরো অংশটি অপরিবর্তনীয় ...
(সম্পাদনা 3 শেষ)
আমি এখন পর্যন্ত যে বিকল্পগুলি নিয়ে এসেছি:
Add
: নেট মধ্যে সাধারণ, কিন্তু মূল তালিকার রূপান্তর বোঝায়Cons
: আমি বিশ্বাস করি এটি কার্যকরী ভাষাগুলির স্বাভাবিক নাম তবে এ জাতীয় ভাষায় অভিজ্ঞতা নেই তাদের কাছে অর্থহীনPlus
: আমার এ পর্যন্ত প্রিয়, এটি আমার কাছে রূপান্তর বোঝায় না । স্পষ্টতই এটি হাস্কেলতেও ব্যবহৃত হয় তবে কিছুটা আলাদা প্রত্যাশার সাথে (একটি হাস্কেল প্রোগ্রামার এটি অন্য তালিকার একক মান যুক্ত করার পরিবর্তে দুটি তালিকা যোগ করার আশা করতে পারে)।With
: কিছু অন্যান্য অপরিবর্তনীয় কনভেনশনগুলির সাথে সামঞ্জস্যপূর্ণ, তবে এটির আইএমওতে যথেষ্ট "সংযোজন" নেই।And
: খুব বর্ণনামূলক নয়।- + এর জন্য অপারেটর ওভারলোড: আমি সত্যিই এটি খুব বেশি পছন্দ করি না; আমি সাধারণত মনে করি অপারেটরগুলি কেবল নিম্ন স্তরের ধরণের ক্ষেত্রে প্রয়োগ করা উচিত। আমি যদিও রাজি হতে রাজি!
আমি যে মানদণ্ডগুলি বেছে নেওয়ার জন্য ব্যবহার করছি তা হ'ল:
- পদ্ধতি কলের ফলাফলের সঠিক ধারণা দেয় (অর্থাত এটি কোনও অতিরিক্ত উপাদান সহ আসল তালিকা)
- এটি যতটা সম্ভব পরিষ্কার করে দেয় যে এটি বিদ্যমান তালিকাকে পরিবর্তিত করে না
- উপরের দ্বিতীয় উদাহরণের মতো একসাথে বেঁধে রাখা যুক্তিযুক্ত মনে হয়
আমি যদি নিজেকে যথেষ্ট পরিষ্কার না করে থাকি তবে আরও বিশদে জিজ্ঞাসা করুন ...
সম্পাদনা 1: এখানে পছন্দ Plus
করার পক্ষে আমার যুক্তি Add
। এই দুটি লাইন কোড বিবেচনা করুন:
list.Add(foo);
list.Plus(foo);
আমার দৃষ্টিতে (এবং এটি একটি ব্যক্তিগত বিষয়) পরবর্তীটি স্পষ্টভাবে বগিযুক্ত - এটি "x + 5" লেখার মতো; নিজস্ব বিবৃতি হিসাবে। প্রথম লাইনটি ঠিক আছে বলে মনে হচ্ছে, যতক্ষণ না আপনি মনে রাখবেন যে এটি পরিবর্তনযোগ্য। আসলে, প্লাস অপারেটরটি যেভাবে তার অপারেশনগুলিকে মিউটেট করে না Plus
তা আমার প্রিয় কারণ এর অন্য কারণ । অপারেটর ওভারলোডিংয়ের সামান্য সামান্যতা ছাড়াই এটি এখনও একই ধারণা দেয়, যার মধ্যে রয়েছে (আমার জন্য) অপারেশনগুলিকে পরিবর্তন না করা (বা এই ক্ষেত্রে পদ্ধতি লক্ষ্য)।
সম্পাদনা 2: যুক্ত পছন্দ না করার কারণগুলি।
বিভিন্ন উত্তর কার্যকরভাবে: "অ্যাড সহ যান That's এটি যা DateTime
করে এবং এর String
মতো Replace
পদ্ধতিও রয়েছে যা অপরিবর্তনীয়তা সুস্পষ্ট করে না।" আমি সম্মত - এখানে একটি নজির আছে। যাইহোক, আমি প্রচুর দেখা করেছি মানুষের কল DateTime.Add
বা String.Replace
এবং পরিব্যক্তি আশা । এখানে নিউজ গ্রুপের প্রশ্নগুলি প্রচুর পরিমাণে রয়েছে (এবং সম্ভবত আশেপাশে খনন করি তবে) যার উত্তর দেওয়া হয় "আপনি এর রিটার্নের মানটিকে অগ্রাহ্য করছেন String.Replace
; স্ট্রিং পরিবর্তনযোগ্য নয়, একটি নতুন স্ট্রিং ফিরে আসবে।"
এখন, আমি প্রশ্নের একটি সূক্ষ্মতা প্রকাশ করা উচিত - প্রকারটি সম্ভবত একটি অপরিবর্তনীয় তালিকা না হতে পারে, তবে একটি পৃথক অপরিবর্তনীয় প্রকার। বিশেষত, আমি একটি বেঞ্চমার্কিং ফ্রেমওয়ার্কে কাজ করছি যেখানে আপনি স্যুটটিতে পরীক্ষা যোগ করেন এবং এটি একটি নতুন স্যুট তৈরি করে। এটা সুস্পষ্ট হতে পারে যে:
var list = new ImmutableList<string>();
list.Add("foo");
কিছুই সম্পাদন করতে যাচ্ছে না, তবে আপনি যখন এটিকে পরিবর্তন করেন তখন এটি অনেকটাই মার্কিয়ার হয়ে যায় :
var suite = new TestSuite<string, int>();
suite.Add(x => x.Length);
দেখে মনে হচ্ছে এটি ঠিক আছে। যদিও এটি আমার কাছে ভুল পরিষ্কার করে দেয়:
var suite = new TestSuite<string, int>();
suite.Plus(x => x.Length);
এটাই হ'ল ভিক্ষা
var suite = new TestSuite<string, int>().Plus(x => x.Length);
আদর্শভাবে, আমি আমার ব্যবহারকারীদের পরীক্ষা স্যুটটি অপরিবর্তনীয় তা না বলা উচিত। আমি তাদের সাফল্যের গর্তে পড়তে চাই। এই হতে পারে সম্ভব নাও হতে, কিন্তু আমি চেষ্টা করতে চাই।
আমি কেবলমাত্র অপরিবর্তনীয় তালিকার ধরণের বিষয়ে কথা বলে মূল প্রশ্নকে অতি-সরল করার জন্য ক্ষমাপ্রার্থী। সমস্ত সংগ্রহগুলি ঠিক তেমন স্ব-বর্ণনামূলক নয় ImmutableList<T>
:)