অপরিবর্তনীয়তার চারপাশে ঘুরে বেড়ায় না এমন ভাষাগুলিতে তৈরি সাধারণত অপরিবর্তনীয় প্রকারগুলি তৈরি করতে আরও বিকাশকারী সময় ব্যয় করতে পারে এবং সম্ভাব্যভাবে ব্যবহার করতে হয় যদি তাদের পছন্দসই পরিবর্তনগুলি প্রকাশ করার জন্য কিছু "বিল্ডার" ধরণের অবজেক্টের প্রয়োজন হয় (এটি সামগ্রিকভাবে এর অর্থ এই নয় যে কাজ আরও বেশি হবে, তবে এই ক্ষেত্রে একটি ব্যয় বহির্ভূত রয়েছে)। এছাড়াও ভাষাটি অপরিবর্তনীয় প্রকারগুলি তৈরি করা সত্যই সহজ করে তোলে কিনা তা নির্বিশেষে, এটি তুচ্ছ-ডেটা ধরণের জন্য সর্বদা কিছু প্রক্রিয়াকরণ এবং মেমরির ওভারহেডের প্রবণতা রাখে।
পার্শ্ব প্রতিক্রিয়াগুলি বাতিল করে ফাংশন করা
আপনি যদি এমন ভাষাগুলিতে কাজ করছেন যা অপরিবর্তনীয়তার চারপাশে ঘুরে বেড়ায় না, তবে আমি মনে করি যে বাস্তববাদী পদ্ধতির প্রতিটি একক ডেটা টাইপকে অপরিবর্তনীয় করে তোলার চেষ্টা করা উচিত নয়। সম্ভাব্য অনেক বেশি উত্পাদনশীল মানসিকতা যা আপনাকে একই সুবিধার অনেকগুলি দেয় আপনার সিস্টেমে কার্যকারিতা সংখ্যা বাড়িয়ে তোলার দিকে মনোনিবেশ করা যা শূন্য পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে ।
একটি সাধারণ উদাহরণ হিসাবে, আপনার যদি এমন কোনও ফাংশন থাকে যা এর মতো পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে:
// Make 'x' the absolute value of itself.
void make_abs(int& x);
তারপরে আমাদের কোনও অপরিবর্তনীয় পূর্ণসংখ্যার ডেটা প্রকারের দরকার নেই যা অপারেটরদের পোস্ট-ইনিশিয়েশনাল এসাইনমেন্টের মতো নিষেধ করে যাতে সেই ফাংশনটি পার্শ্ব প্রতিক্রিয়া এড়ায়। আমরা কেবল এটি করতে পারি:
// Returns the absolute value of 'x'.
int abs(int x);
এখন ফাংশনটি x
তার ব্যাপ্তির বাইরে বা অন্য কোনও কিছুতে গণ্ডগোল করে না এবং এই তুচ্ছ ক্ষেত্রে আমরা হয়ত ইন্ডিয়ারেশন / এলিয়াসিংয়ের সাথে সম্পর্কিত কোনও ওভারহেড এড়িয়ে কিছু চক্র চাঁচাও করতে পারি। খুব কমপক্ষে দ্বিতীয় সংস্করণটি প্রথমটির চেয়ে বেশি গণনামূলকভাবে ব্যয়বহুল হওয়া উচিত নয়।
সম্পূর্ণ কপি করার জন্য ব্যয়বহুল
অবশ্যই যদি আমরা কোনও ফাংশন কারণের পার্শ্ব প্রতিক্রিয়া তৈরি করা এড়াতে চাই তবে বেশিরভাগ ক্ষেত্রেই এটি তুচ্ছ নয়। একটি জটিল বাস্তব-ব্যবহারের কেস আরও এরকম হতে পারে:
// Transforms the vertices of the specified mesh by
// the specified transformation matrix.
void transform(Mesh& mesh, Matrix4f matrix);
এই মুহুর্তে জালটির জন্য কয়েক সহস্রাধিক বহুভুজের সাথে আরও কয়েকশো মেগাবাইট মেমরির প্রয়োজন হতে পারে, আরও বেশি প্রান্ত এবং প্রান্ত, একাধিক টেক্সচার মানচিত্র, আকারের লক্ষ্যবস্তু ইত্যাদি etc. পুরো জালটি কেবল এটি তৈরি করার জন্য অনুলিপি করা সত্যিই ব্যয়বহুল হবে ' transform
পার্শ্ব প্রতিক্রিয়া মুক্ত ফাংশন, যেমন:
// Returns a new version of the mesh whose vertices been
// transformed by the specified transformation matrix.
Mesh transform(Mesh mesh, Matrix4f matrix);
এবং এটি এই ক্ষেত্রে যেখানে সম্পূর্ণরূপে কোনও কিছু অনুলিপি করা একটি মহাকাব্য ওভারহেড হবে যেখানে আমি এটির Mesh
পরিবর্তিত সংস্করণগুলি তৈরি করার জন্য অবিচলিত "বিল্ডার" এর সাথে অবিচলিত ডেটা কাঠামো এবং একটি অপরিবর্তনীয় ধরণের রূপান্তরিত করতে দরকারী বলে মনে করি অনন্য নয়, কেবল অগভীর অনুলিপি এবং রেফারেন্স গণনা অংশগুলি করতে পারে। পার্শ্ব প্রতিক্রিয়া মুক্ত যা জাল ফাংশন লিখতে সক্ষম হওয়ার ফোকাস সহ এটিই রয়েছে।
ধারাবাহিক ডেটা স্ট্রাকচারস
এবং এই ক্ষেত্রে যেখানে সমস্ত কিছু অনুলিপি করা ব্যয়বহুল হিসাবে ব্যয়বহুল, আমি Mesh
এটির জন্য সামান্য খাড়া ব্যয়সাধ্য সাময়িক খরচ থাকা সত্ত্বেও সত্যিই অর্থ প্রদানের জন্য একটি অপরিবর্তনীয় ডিজাইনের প্রয়াস পেয়েছি , কারণ এটি কেবল থ্রেড সুরক্ষাটিকে সহজতর করেনি। এটি অ-ধ্বংসাত্মক সম্পাদনাও সহজ করেছে (ব্যবহারকারীকে তার মূল অনুলিপিটি পরিবর্তন না করেই জাল ক্রিয়াকলাপ স্থাপনের অনুমতি দেওয়া), পূর্বাবস্থায় ফিরানো সিস্টেম (এখন পূর্বাবস্থায় ফেলা সিস্টেম মেমরির গতি ছাড়াই কোনও অপারেশনের পরিবর্তনের আগে জালটির অপরিবর্তনীয় অনুলিপি সংরক্ষণ করতে পারে) ব্যবহার করুন) এবং ব্যতিক্রম-সুরক্ষা (এখন যদি উপরের ফাংশনে কোনও ব্যতিক্রম ঘটে তবে ফাংশনটি পিছনে ফিরে আসতে পারে না এবং এর সমস্ত পার্শ্ব প্রতিক্রিয়াগুলি পূর্বাবস্থায় ফিরিয়ে আনতে হবে না কারণ এটি কোনও কারণই শুরু করে না)।
আমি আত্মবিশ্বাসের সাথে এই ক্ষেত্রে বলতে পারি যে এই বিশাল ডেটা স্ট্রাকচারগুলিকে অপরিবর্তনীয় করে তুলতে সময় প্রয়োজন হয় তার ব্যয়ের চেয়ে বেশি সময় বাঁচায়, যেহেতু আমি এই নতুন ডিজাইনের রক্ষণাবেক্ষণ ব্যয়কে পূর্বেরগুলির তুলনায় তুলনা করেছি যা পার্শ্ব প্রতিক্রিয়া ঘটাচ্ছে এমন ফাংশনগুলির সাথে ঘুরে দেখা গেছে, এবং পূর্ববর্তী পরিবর্তনীয় ডিজাইনগুলির জন্য অনেক বেশি সময় ব্যয় হয় এবং মানব ত্রুটির চেয়ে অনেক বেশি ঝুঁকির ঝুঁকি ছিল, বিশেষত এমন ক্ষেত্রগুলিতে যেগুলি ব্যতিক্রম-সুরক্ষার মতো ক্রંચের সময় ডেভলপারদের জন্য অবহেলা করার জন্য প্রলুব্ধ করে।
সুতরাং আমি মনে করি এই ক্ষেত্রে অপরিবর্তনীয় ডেটা প্রকারগুলি সত্যই পরিশোধ করতে পারে তবে আপনার সিস্টেমে বেশিরভাগ কার্যকারিতা পার্শ্ব প্রতিক্রিয়ামুক্ত করতে সমস্ত কিছুই অপরিবর্তনীয় করে তুলতে হবে না। সম্পূর্ণ কপি করার জন্য অনেক কিছুই যথেষ্ট সস্তা। এছাড়াও অনেক রিয়েল-ওয়ার্ল্ড অ্যাপ্লিকেশনগুলিকে এখানে এবং সেখানে কিছুটা পার্শ্ব প্রতিক্রিয়া তৈরি করতে হবে (খুব কমপক্ষে কোনও ফাইল সংরক্ষণের মতো) তবে সাধারণত আরও অনেকগুলি কার্য রয়েছে যা পার্শ্ব প্রতিক্রিয়া থেকে বঞ্চিত হতে পারে।
আমার কাছে কিছু অপরিবর্তনীয় ডেটা টাইপ থাকার বিষয়টি হ'ল এটি নিশ্চিত করা যে আমরা অতিমাত্রায় ছোট ছোট অংশের বাম এবং ডানদিকে গভীর অনুলিপি আকারের বৃহত ডাটা স্ট্রাকচার আকারে মহাকাব্য ওভারহেড ব্যয় না করে পার্শ্ব প্রতিক্রিয়া মুক্ত হতে সর্বাধিক সংখ্যক ফাংশন লিখতে পারি তাদের মধ্যে পরিবর্তন করতে হবে। এই ক্ষেত্রে চারপাশে অবিরাম ডেটা স্ট্রাকচার থাকার পরে একটি অপ্টিকেশন ব্যয় না দিয়ে পার্শ্ব প্রতিক্রিয়া মুক্ত আমাদের ফাংশনগুলি লেখার অনুমতি দেওয়ার জন্য একটি অপ্টিমাইজেশন বিশদ হয়ে যায়।
অপরিবর্তনীয় ওভারহেড
এখন ধারণামূলকভাবে পরিবর্তনীয় সংস্করণগুলির দক্ষতার সর্বদা একটি কিনারা থাকবে। অপরিবর্তনীয় ডেটা স্ট্রাকচারের সাথে জড়িত কম্পিউটারের ওভারহেড সর্বদা থাকে। তবে আমি উপরে বর্ণিত কেসগুলিতে এটি একটি উপযুক্ত বিনিময় হিসাবে পেয়েছি এবং আপনি ওভারহেডকে পর্যাপ্ত পরিমাণে প্রকৃতির ন্যূনতম করার দিকে মনোনিবেশ করতে পারেন। আমি সেই ধরণের পদ্ধতির পছন্দ করি যেখানে নির্ভুলতা সহজ হয়ে যায় এবং অপ্টিমাইজেশন আরও সহজতর হওয়ার পরিবর্তে শক্ত হয়ে যায় তবে নির্ভুলতা আরও শক্ত হয়ে ওঠে। কোডটি প্রায়শই সঠিকভাবে কার্যকর হয় যা কোডের তুলনায় আরও কিছু টিউন আপগুলির প্রয়োজনে পুরোপুরি সঠিকভাবে কাজ করে যা এটির ভুল ফলাফলগুলি যত দ্রুতই অর্জন করুক না কেন প্রথম স্থানে সঠিকভাবে কাজ করে না।