আমি পড়ছি এবং শুনছি যে লোকেরা (এই সাইটেও) নিয়মিত কার্যকরী প্রোগ্রামিং দৃষ্টান্তের প্রশংসা করে, সবকিছু অপরিবর্তনীয় রাখার পক্ষে কতটা ভাল তা জোর দিয়ে। উল্লেখযোগ্যভাবে, লোকেরা এমনকি সি #, জাভা বা সি ++ এর মতো traditionতিহ্যগতভাবে অপরিহার্য ওও ভাষাগুলিতেও এই পদ্ধতির প্রস্তাব দেয় যা কেবলমাত্র হাস্কেলের মতো নিখুঁত কার্যকরী ভাষায় নয় যা প্রোগ্রামারকে এটিকে জোর করে।
আমি বুঝতে অসুবিধা বোধ করি, কারণ আমি পার্শ্ব প্রতিক্রিয়া এবং পার্শ্ব-প্রতিক্রিয়াগুলি দেখতে পাই ... সুবিধাজনক। যাইহোক, লোকেরা কীভাবে পার্শ্ব প্রতিক্রিয়াগুলির নিন্দা করে এবং এটি যেখানে সম্ভব সম্ভব এগুলি থেকে মুক্তি পাওয়ার জন্য একটি ভাল অনুশীলন হিসাবে বিবেচনা করে, আমি বিশ্বাস করি যে আমি যদি একজন দক্ষ প্রোগ্রামার হতে চাই তবে আমাকে এই দৃষ্টান্তটির আরও ভাল বোঝার দিকে যাত্রা শুরু করতে হবে ... অতএব আমার প্রশ্ন
যখন আমি কার্যকরী দৃষ্টান্তের সাথে সমস্যাগুলি পাই তখন একটি জায়গা হ'ল যখন কোনও বস্তুটি একাধিক স্থান থেকে প্রাকৃতিকভাবে রেফারেন্স হয়। আমি এটি দুটি উদাহরণে বর্ণনা করি।
প্রথম উদাহরণটি হ'ল আমার সি # গেমটি আমি আমার অতিরিক্ত সময় তৈরির চেষ্টা করছি । এটি টার্ন-ভিত্তিক ওয়েব গেম যেখানে উভয় খেলোয়াড়েরই 4 টি দানব রয়েছে এবং তারা তাদের দল থেকে একটি রাক্ষসকে যুদ্ধের ময়দানে পাঠাতে পারে, যেখানে এটি বিরোধী খেলোয়াড়ের পাঠানো দানবের মুখোমুখি হবে। খেলোয়াড়রা যুদ্ধক্ষেত্র থেকে দানবগুলিকেও স্মরণ করতে পারে এবং তাদের দল থেকে অন্য দানব (একইভাবে পোকেমন-এর মতো) দিয়ে প্রতিস্থাপন করতে পারে।
এই সেটিংয়ে, একক দানবকে কমপক্ষে 2 টি স্থান থেকে স্বাভাবিকভাবেই উল্লেখ করা যেতে পারে: একটি খেলোয়াড়ের দল এবং যুদ্ধক্ষেত্র, যা দুটি "সক্রিয়" দানবদের উল্লেখ করে।
এখন আসুন পরিস্থিতিটি বিবেচনা করুন যখন কোনও দানব আঘাতপ্রাপ্ত হয় এবং 20 টি স্বাস্থ্য পয়েন্ট হারিয়ে ফেলে। আবশ্যকীয় দৃষ্টান্তের বন্ধনীগুলির মধ্যে আমি এই দৈত্যের health
ক্ষেত্রটি পরিবর্তনটি প্রতিবিম্বিত করতে এই পরিবর্তনটি করেছি - এবং আমি এখন এটি করছি। যাইহোক, এটি Monster
শ্রেণিটিকে পরিবর্তনযোগ্য এবং সম্পর্কিত ফাংশনগুলি (পদ্ধতিগুলি) অপরিষ্কার করে তোলে , যা আমি অনুমান করি যে এটি এখনকার হিসাবে খারাপ অভ্যাস হিসাবে বিবেচিত হয়।
যদিও ভবিষ্যতের কোনও পর্যায়ে আসলে এটি শেষ করার কোনও আশা থাকতে আমি নিজেকে এই গেমটির কোডটি একটি আদর্শের চেয়ে কম-কম আদর্শ অবস্থানে থাকার অনুমতি দিয়েছি, তবে আমি এটি জানতে এবং বুঝতে চাই যে এটি কেমন হওয়া উচিত সঠিকভাবে লেখা। অতএব: এটি যদি কোনও ডিজাইনের ত্রুটি হয় তবে কীভাবে এটি ঠিক করবেন?
ক্রিয়ামূলক শৈলীতে, যেমনটি আমি এটি বুঝতে পারি, পরিবর্তে আমি এই Monster
বস্তুর একটি অনুলিপি তৈরি করব , এটি এই ক্ষেত্রটি বাদে পুরানোটির সাথে অভিন্ন; এবং পদ্ধতিটি suffer_hit
জায়গায় পুরানোটিকে পরিবর্তনের পরিবর্তে এই নতুন অবজেক্টটি ফিরিয়ে দেবে। তারপরে আমি একইভাবে Battlefield
এই দানবটি বাদে তার সমস্ত ক্ষেত্র একই করে রাখি copy
এটি কমপক্ষে 2 টি সমস্যা নিয়ে আসে:
- শ্রেণিবিন্যাস সহজেই
Battlefield
-> এর সহজ সরল উদাহরণের চেয়ে অনেক গভীর হতে পারেMonster
। আমাকে এই ক্ষেত্রটি বাদ দিয়ে সমস্ত ক্ষেত্রের অনুলিপি করা এবং একটি নতুন অবজেক্টটি ফিরিয়ে আনতে হবে। এটি বয়লারপ্লেট কোড হবে যা আমি বিরক্তিকর বলে মনে করি বিশেষত যেহেতু কার্যকরী প্রোগ্রামিংয়ের বয়লারপ্লেট হ্রাস করার কথা। - তবে আরও একটি গুরুতর সমস্যা হ'ল এটি ডেটা সিঙ্কের বাইরে চলে যাবে । ক্ষেত্রের সক্রিয় দৈত্যটি তার স্বাস্থ্য হ্রাস দেখতে পাবে; তবে এটির নিয়ন্ত্রণকারী প্লেয়ার থেকে উল্লেখ করা এই একই দানবটি
Team
তা করবে না। আমি এর পরিবর্তে অনুজ্ঞাসূচক শৈলী আশ্লিষ্ট পারেন, তথ্য প্রতিটি পরিমার্জন কোডের এবং আপনার ডিভাইসে এক আমি এটা সত্যিই সুবিধাজনক এটি মত এই ক্ষেত্রে অন্য সব জায়গা থেকে অবিলম্বে দৃশ্যমান হবে - কিন্তু উপায় আমি পেয়ে করছি এই হল অবিকল মানুষের বলে অপরিহার্য শৈলীতে ভুল!- এখন
Team
প্রতিটি আক্রমণের পরে যাত্রা করে এই বিষয়টির যত্ন নেওয়া সম্ভব হবে । এটি অতিরিক্ত কাজ। তবে, যদি কোনও দৈত্যকে হঠাৎ আরও বেশি জায়গা থেকে রেফারেন্স করা যায় তবে কী হবে? যদি আমি এমন কোনও দক্ষতা নিয়ে আসি যা উদাহরণস্বরূপ, কোনও দৈত্যকে অন্য দৈত্যের দিকে মনোনিবেশ করতে দেয় যা অগত্যা মাঠে না আসে (আমি আসলে এই জাতীয় ক্ষমতা বিবেচনা করছি)? আমি কী অবশ্যই প্রতিটি আক্রমণের পরে অবিলম্বে দৃষ্টি নিবদ্ধ দানবদের ভ্রমণ করতে মনে করব ? কোডটি আরও জটিল হয়ে উঠলে এটি বিস্ফোরিত হবে এমন একটি টাইম বোমা বলে মনে হচ্ছে, সুতরাং আমি মনে করি এটি কোনও সমাধান নয়।
- এখন
আমার দ্বিতীয় উদাহরণ থেকে আরও ভাল সমাধানের জন্য একটি ধারণা আসে, যখন আমি একই সমস্যায় পড়ি। একাডেমিয়ায় আমাদের বলা হয়েছিল হাসকেলে আমাদের নিজস্ব ডিজাইনের একটি ভাষার অনুবাদক লিখতে। (এফপি কী তা বোঝার জন্য আমাকে এইভাবে বাধ্য করা হয়েছিল)। আমি ক্লোজারগুলি বাস্তবায়ন করার সময় সমস্যাটি প্রকাশ পেয়েছিল। আবার একই সুযোগটি এখন একাধিক স্থান থেকে রেফারেন্স করা যেতে পারে: এই সুযোগটি ধরে রাখে এমন ভেরিয়েবলের মাধ্যমে এবং কোনও নেস্টেড স্কোপের প্যারেন্ট স্কোপ হিসাবে! স্পষ্টতই, যদি কোনও রেফারেন্সের প্রতি নির্দেশ করে এই সুযোগে কোনও পরিবর্তন আনা হয়, তবে অন্যান্য পরিবর্তনগুলিও এই পরিবর্তনটি অবশ্যই দৃশ্যমান হবে।
আমি যে সমাধানটি নিয়ে এসেছি তা হ'ল প্রতিটি সুযোগকে একটি আইডি নির্ধারণ এবং মোনাদে সমস্ত স্কোপের একটি কেন্দ্রীয় অভিধান রাখা State
। এখন ভেরিয়েবলগুলি কেবল স্কোপের চেয়ে তাদের যে স্কোপ থেকে আবদ্ধ ছিল তার আইডি ধরে রাখবে এবং নেস্টেড স্কোপগুলি তাদের পিতামাত স্কোপের আইডিও ধারণ করবে।
আমার অনুমান যে আমার দানব যুদ্ধের খেলায় একই পদ্ধতির চেষ্টা করা যেতে পারে ... ক্ষেত্র এবং দলগুলি দানবদের রেফারেন্স দেয় না; তারা পরিবর্তে একটি কেন্দ্রীয় দৈত্য অভিধানে সংরক্ষিত দানবগুলির আইডি রাখে।
তবে আমি এই পদ্ধতির সাথে আবারও একটি সমস্যা দেখতে পাচ্ছি যা সমস্যার সমাধান হিসাবে বিনা দ্বিধায় এটিকে গ্রহণ করতে আমাকে বাধা দেয়:
এটি আবার বয়লারপ্লেট কোডের উত্স। এটি প্রয়োজনীয়ভাবে 3-লাইনার তৈরি করে: পূর্বে একক ক্ষেত্রের এক-লাইন ইন-প্লেস সংশোধন করার জন্য এখন (ক) কেন্দ্রীয় অভিধান থেকে বস্তুটি পুনরুদ্ধার করা (খ) পরিবর্তন করা (গ) নতুন বস্তু সংরক্ষণ করা কেন্দ্রীয় অভিধানে। এছাড়াও, উল্লেখগুলির পরিবর্তে অবজেক্টস এবং কেন্দ্রীয় অভিধানগুলির আইডি রাখা জটিলতা বাড়ে। যেহেতু এফপি জটিলতা এবং বয়লারপ্লেট কোড হ্রাস করার জন্য বিজ্ঞাপন দেওয়া হয়েছে , এই ইঙ্গিতগুলি আমি এটি ভুল করছি।
আমি আরও বেশি তীব্র বলে মনে হচ্ছে অ্যাসিকন্ড সমস্যা সম্পর্কে লিখতে যাচ্ছিলাম: এই পদ্ধতির মাধ্যমে মেমরি ফাঁস প্রবর্তিত হয় । অ্যাক্সেসযোগ্য অবজেক্টগুলি সাধারণত জঞ্জাল সংগ্রহ করা হবে। তবে, কোনও কেন্দ্রীয় অভিধানে রাখা অবজেক্টগুলি আবর্জনা সংগ্রহ করা যাবে না, এমনকি যদি কোনও ਪਹੁੰਚযোগ্য বস্তু এই নির্দিষ্ট আইডির উল্লেখ না করে। এবং তাত্ত্বিকভাবে সতর্ক প্রোগ্রামিং যখন মেমরি ফাঁস এড়াতে পারে (আমরা প্রতিটি অভিধানের প্রয়োজন নেই তখন কেন্দ্রীয় অভিধান থেকে ম্যানুয়ালি মুছে ফেলার যত্ন নিতে পারি), এটি ত্রুটিযুক্ত এবং এফপি প্রোগ্রামগুলির যথার্থতা বাড়ানোর জন্য বিজ্ঞাপনিত হয় যাতে এটি আবারও হতে পারে সঠিক উপায় না।
যাইহোক, আমি সময়মতো খুঁজে পেয়েছি যে এটি বরং এটি একটি সমাধান করা সমস্যা বলে মনে হচ্ছে। জাভা সরবরাহ করে WeakHashMap
যা এই সমস্যাটি সমাধান করতে ব্যবহৃত হতে পারে। সি # একটি অনুরূপ সুবিধা সরবরাহ করে - ConditionalWeakTable
- যদিও ডক্স অনুসারে এটি সংকলকগণ দ্বারা ব্যবহার করা বোঝানো হয়েছিল। এবং হাস্কেলে আমাদের সিস্টেম.মিম.উইক রয়েছে ।
এই জাতীয় অভিধান সংরক্ষণ করা কি এই সমস্যার সঠিক কার্যকরী সমাধান বা এর চেয়ে সহজ সরল একটি যা আমি দেখতে ব্যর্থ হয়েছি? আমি কল্পনা করি যে এই জাতীয় অভিধানের সংখ্যা সহজেই বা খারাপভাবে বৃদ্ধি পেতে পারে; সুতরাং যদি এই কথাসাহিত্যগুলিকেও অবিচ্ছেদ্য বলে মনে করা হয় তবে এর অর্থ অনেকগুলি প্যারামিটার-পাসিং হতে পারে বা ভাষাগুলি যা সমর্থন করে যে, একাকী গণনা, যেহেতু অভিধানগুলি মনাদে অনুষ্ঠিত হবে (তবে আবার আমি পড়ছি যে পুরোপুরি কার্যকরীভাবে) যতটা সম্ভব সংক্ষিপ্ত কোডগুলি ভাষাগুলি monadic হওয়া উচিত, যদিও এই অভিধানের সমাধানটি প্রায় সমস্ত State
কোডকে মোনাডের ভিতরে রাখে ; যা আমাকে আবার সন্দেহ করে তোলে এটি সঠিক সমাধান কিনা।)
কিছু বিবেচনার পরে আমি মনে করি আমি আরও একটি প্রশ্ন যুক্ত করব: আমরা এই জাতীয় অভিধান তৈরি করে কী অর্জন করব? অনেক বিশেষজ্ঞের মতে অপরিহার্য প্রোগ্রামিংয়ে যা ভুল তা হ'ল কিছু বস্তুর পরিবর্তন কোডের অন্যান্য অংশে প্রচার করে। এই সমস্যাটি সমাধান করার জন্য অবজেক্টগুলি অপরিবর্তনীয় বলে মনে করা হচ্ছে - অবিকল এই কারণে, যদি আমি সঠিকভাবে বুঝতে পারি তবে সেগুলিতে করা পরিবর্তনগুলি অন্য কোথাও দৃশ্যমান হওয়া উচিত নয়। তবে এখন আমি পুরানো ডেটাতে অপারেটিং কোডের অন্যান্য টুকরো সম্পর্কে উদ্বিগ্ন তাই আমি কেন্দ্রীয় অভিধানগুলি উদ্ভাবন করি যাতে ... আবার কিছু কোডের টুকরোয় পরিবর্তিত হয়ে কোডের অন্যান্য টুকরোতে প্রচার হয়! অতএব, আমরা কি তার অনুমিত শৈলীতে তার সমস্ত অনুভূত ত্রুটিগুলি নিয়ে ফিরে আসি না, তবে যুক্ত জটিলতা সহ?
Team
) যুদ্ধের ফলাফল পুনরুদ্ধার করতে পারে এবং এইভাবে একটি (যুদ্ধের সংখ্যা, দানব সত্তা আইডি) টিপল দ্বারা দানবদের রাজ্যগুলি অর্জন করতে পারে।