ক্রিয়ামূলক প্রোগ্রামিংয়ে রাষ্ট্রীয় সমস্যাগুলি মোকাবেলা করা


18

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


4
প্রথম পদক্ষেপটি সম্ভবত বুঝতে পারে যে সমস্যাগুলি সহজাতভাবে রাষ্ট্রীয় নয়।
তেলস্তিন

4
কিছু সমস্যা সহজাতভাবে রাষ্ট্রীয়, যেমন একটি ডাটাবেসে লেখার বা গুই আঁকার মতো। আমার কণা সিমুলেটার উদাহরণ গ্রহণ করে, এটি সম্পর্কে ভাবার বিকল্প উপায় কী হবে? রাষ্ট্র এড়ানোর জন্য তাদের অবস্থানের আপডেটগুলি প্রতিবার নতুন কণা ফিরিয়ে দেওয়া আমার কাছে অযোগ্য বলে মনে হয়, এবং বাস্তব বিশ্বের ভাল মডেল নয়।
অ্যান্ড্রু মার্টিন

4
সম্ভবত ডাটাবেসের উদাহরণস্বরূপ ছাড়া, সেই সমস্যা আছে না মজ্জাগতভাবে stateful। উদাহরণস্বরূপ, জিইউআই প্রোগ্রামিংয়ের জন্য, আপনি সত্যিই সময়ের দরিদ্র, অন্তর্নিহিত মডেল হিসাবে পরিবর্তনীয় অবস্থা ব্যবহার করছেন ; ক্রিয়ামূলক প্রতিক্রিয়াশীল প্রোগ্রামিং আপনাকে একত্রিত করতে পারে এমন ইভেন্টগুলির স্ট্রিম সরবরাহ করে রাষ্ট্রের উপর নির্ভর না করে স্পষ্টভাবে মডেল সময় দেয় ।
টিখন জেলভিস

1
এর একটি সহজ সমাধান রয়েছে: যখন আপনি এমন কোনও সমস্যার মুখোমুখি হন যা এফপি কৌশলগুলির সাহায্যে সহজেই মডেল করা যায় না, তখন সমাধানের জন্য কার্যকরী প্রোগ্রামিং ব্যবহার করবেন না। কাজের জন্য সমস্ত কিছুর সঠিক সরঞ্জাম এবং ...
ম্যাসন হুইলার

1
@ অ্যান্ড্রুমার্টিন বাস্তব বিশ্বের ভাল মডেল নয়? প্রকৃত বিশ্বের মডেল করতে পদার্থবিজ্ঞানে ব্যবহৃত গণিত খাঁটিভাবে কার্যকরী। একটি ভাল আবর্জনা সংগ্রহকারীকে কোনও বস্তুর বরাদ্দ করা পয়েন্টারকে ধাক্কা দেওয়ার মতো সস্তা এবং সংগ্রহের সময় লাইভ অবজেক্টের সংখ্যার সাথে সমানুপাতিক । যদি কিছু হয় তবে, আমি ফাংশনাল প্রোগ্রামিংয়ের অদক্ষতার প্রধান উত্স বাজিয়ে দেব যা ক্যাশে-দক্ষ নয় এমন ডেটা স্ট্রাকচার ব্যবহার করে। লিঙ্কযুক্ত তালিকাগুলি এবং বাইনারি গাছগুলি ক্যাশে দক্ষতার ঠিক পোস্টার চাইল্ড নয়।
ডোভাল

উত্তর:


20

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

এখানে মৌলিক কৌশলটি হ'ল আপনি এমন একটি ফাংশন তৈরি করেন যা একটি রাজ্য গ্রহণ করে এবং নতুন রাষ্ট্র ফিরিয়ে দেয় । সুতরাং একটি কণা সিমুলেটর একটি ফাংশন যা Setইনপুট হিসাবে একটি কণা গ্রহণ করে এবং Setএকটি সময় পদক্ষেপের পরে নতুন কণা ফেরত দেয় । তারপরে আপনি কেবলমাত্র বার বার সেই ফাংশনটিকে তার পূর্ববর্তী ফলাফলের ইনপুট সেট করে কল করবেন।


5
+1 এফপিতে রাষ্ট্র থাকা ঠিক আছে, কেবল পরিবর্তনযোগ্য স্থিতি নয় ।
জেলেট

1
এই অন্তর্দৃষ্টি জন্য ধন্যবাদ। অদক্ষতা সম্পর্কে আমার উদ্বেগগুলি @ ললক দ্বারা ব্যর্থ হয়েছিল; রাষ্ট্র কীভাবে রূপান্তরিত হয় তার প্রযুক্তিগত বিবরণ হ'ল একটি নিম্ন স্তরের বাস্তবায়ন সমস্যা যা ভাষা নিজেই সমাধান করার কথা। আমি রিচ হিকিকে একটি ভিডিওতে ক্লোজারের সাথে কীভাবে ব্যাখ্যা করে তা দেখেছি।
অ্যান্ড্রু মার্টিন

1
@ জেজলেট: আরও স্পষ্ট করে বলতে: এফপির রাষ্ট্র, এমনকি পরিবর্তনীয় রাষ্ট্র রয়েছে, তবে তারা পরিবর্তনীয় ভেরিয়েবলগুলি ব্যবহার করে এটি উপস্থাপন করে না।
জর্জিও

9

@ কার্লবিলিফেল্ড দ্বারা উল্লিখিত হিসাবে, এই জাতীয় সমস্যার কার্যকরী পন্থা হ'ল এটিকে আগের অবস্থা থেকে নতুন রাষ্ট্র ফিরিয়ে দেওয়া হিসাবে দেখা। ফাংশন নিজেদের যাতে সর্বদা সেগুলির রাষ্ট্র আপডেট হবে কোন তথ্য রাখা না, মি অবস্থায় এন

আমি মনে করি আপনি এটি অদক্ষ বলে মনে করেন কারণ আপনি ধরে নিয়েছেন যে নতুন রাজ্যটি গণনা করার সময় পূর্ববর্তী অবস্থা স্মৃতিতে রাখতে হবে । লক্ষ্য করুন যে সম্পূর্ণ নতুন রাষ্ট্র লেখার বা পুরানো স্থানে পুনরায় লেখার মধ্যেকার পছন্দটি কার্যকরী ভাষার দৃষ্টিকোণ থেকে বাস্তবায়নের বিশদ

উদাহরণস্বরূপ, বলুন আমার কাছে দশ মিলিয়ন পূর্ণসংখ্যার একটি তালিকা রয়েছে এবং দশমকে একক দ্বারা বৃদ্ধি করতে চাই। দশম স্থানে নতুন নম্বর দিয়ে পুরো তালিকাটি অনুলিপি করা অপব্যয়, আপনি ঠিক বলেছেন; তবে এটি কেবলমাত্র ভাষা সংকলক বা দোভাষীর কাছে ক্রিয়াকলাপটি বর্ণনা করার ধারণামূলক উপায়। সংকলক বা দোভাষা প্রথম তালিকা নিতে এবং কেবল দশম অবস্থানটি ওভাররাইট করতে বিনামূল্যে to

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

যা কিছু বলা হয়েছিল, তা এমনকি হাস্কেলের মধ্যে এমন একটি রাষ্ট্রীয় মনড রয়েছে যা পরিস্থিতিগুলির মডেল করতে সহায়তা করে যেখানে "রাষ্ট্র বজায় রাখা" একটি সমস্যার আরও স্বজ্ঞাত সমাধান। কিন্তু কিছু সমস্যা লক্ষ্য করুন আপনি এটি " মজ্জাগতভাবে stateful, একটি ডাটাবেস লিখিতভাবে মত " have Datomic মত অপরিবর্তনীয় সমাধান । এটি অবাক করে দেওয়া অবধি অবধি অবধি বোঝা যাচ্ছে না যে এটি একটি ধারণা, এটি উপলব্ধি করার দরকার নেই।


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

@ দোভাল: "সংকলক এটি করতে পারলেও, কেবলমাত্র সেই ক্ষেত্রেই সম্ভব যেখানে আপনি তালিকার পূর্ববর্তী সংস্করণগুলিতে ধরে রাখেন না" ": এটি ক্লিনে অনন্য প্রকারের কথা মনে করিয়ে দেয়।
জর্জিও

4

সঠিক মানসিক মডেলটি সাবস্ক্রাইব করা একজনকে রাষ্ট্র সম্পর্কে আরও ভালভাবে চিন্তা করতে এবং পরিচালনা করতে সহায়তা করে। আমার মনে, সেরা মানসিক মডেল হ'ল ফ্লিপ বই । এই ক্লিকগুলি একবার আপনি বুঝতে পারবেন যে এফপি বিশ্বের স্থিতিশীল ডেটা স্ট্রাকচারের উপর প্রচুর ঝুঁকছে এবং কোনও অবস্থাতেই কোনও রূপান্তর ছাড়াই সেই অবস্থানে রূপান্তর করতে এই ফাংশনগুলি ব্যবহার করা হয়।

রিচ হিকি এই ধারণাগুলি আলোকিত করে:

সেখানে অন্যান্য আলোচনা হয় কিন্তু এই ডান দিক আপনি পাঠাতে করা উচিত নয়।


3

বড় এবং মাঝারিভাবে বড় অ্যাপ্লিকেশনগুলি লেখার সময়, আমি প্রায়শই অ্যাপ্লিকেশনের যে অংশগুলি রাষ্ট্রীয় এবং যেগুলি রাষ্ট্রবিহীন সেগুলির অংশগুলির মধ্যে পার্থক্য করার পক্ষে দরকারী হয়ে পড়েছি।

রাষ্ট্রীয় বিভাগে শ্রেণি / উপাত্ত কাঠামো অ্যাপ্লিকেশনটির ডেটা সংরক্ষণ করে এবং এই বিভাগের ফাংশনগুলি অ্যাপ্লিকেশনটির ডেটার অন্তর্নিহিত জ্ঞান সহ কাজ করে।

রাষ্ট্রবিহীন বিভাগে শ্রেণি / উপাত্ত কাঠামো / ফাংশন প্রয়োগের খাঁটি অ্যালগরিদমিক দিকগুলিকে সমর্থন করার জন্য রয়েছে। অ্যাপ্লিকেশনটির ডেটা সম্পর্কে তাদের অন্তর্নিহিত জ্ঞান নেই। তারা খাঁটি কার্যকরী প্রকৃতিতে কাজ করে। আবেদনের স্টেটফুল অংশগুলি প্রয়োগের রাজ্যবিহীন বিভাগে চলমান ক্রিয়াকলাপগুলির পার্শ্ব প্রতিক্রিয়া হিসাবে রাষ্ট্রের পরিবর্তন অনুভব করতে পারে।

সবচেয়ে কঠিন অংশটি নির্ধারণ করা হচ্ছে যে রাজ্যহীন বিভাগে কোন ক্লাস / ফাংশন স্থাপন করা উচিত এবং কোন শ্রেণী / ফাংশনগুলিকে রাষ্ট্রীয় বিভাগে রাখা উচিত এবং তাদের আলাদা ফাইল / লাইব্রেরিতে রাখার শৃঙ্খলা থাকা having


কিভাবে এই প্রশ্নের উত্তর দেয়? (ডাউন-ভোটিং) নয়
ক্রাভেমির

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