তারা কী সমস্যা সমাধান করে আমি তা পাই না।
তারা কী সমস্যা সমাধান করে আমি তা পাই না।
উত্তর:
মনদেহগুলি ভাল না খারাপও নয়। তারা ঠিক আছে। এগুলি এমন সরঞ্জাম যা প্রোগ্রামিং ভাষার অন্যান্য নির্মাণগুলির মতো সমস্যার সমাধান করতে ব্যবহৃত হয়। তাদের মধ্যে একটি খুব গুরুত্বপূর্ণ অ্যাপ্লিকেশন হ'ল শুদ্ধ কার্যকরী ভাষায় কর্মরত প্রোগ্রামারদের জীবন সহজ করা। তবে এগুলি অ-কার্যকরী ভাষায় দরকারী; এটা ঠিক যে লোকেরা খুব কমই বুঝতে পারে যে তারা একটি মোনাড ব্যবহার করছে।
মোনাড কী? একটি মোনাডকে ভাবার সবচেয়ে ভাল উপায় হ'ল ডিজাইনের ধরণ হিসাবে। আই / ও এর ক্ষেত্রে, আপনি সম্ভবত এটি গৌরবময় পাইপলাইন হিসাবে সামান্য কিছু হিসাবে ভাবতে পারেন যেখানে বিশ্বব্যাপী রাষ্ট্রটি পর্যায়গুলির মধ্য দিয়ে চলেছে।
উদাহরণস্বরূপ, আপনি যে কোডটি লিখছেন তা গ্রহণ করুন:
do
putStrLn "What is your name?"
name <- getLine
putStrLn ("Nice to meet you, " ++ name ++ "!")
চোখের দেখা মিলানোর চেয়ে এখানে আরও অনেক কিছু চলছে। উদাহরণস্বরূপ, আপনি লক্ষ্য করুন যে putStrLn
নিম্নলিখিত স্বাক্ষর আছে : putStrLn :: String -> IO ()
. কেন?
এটি এইভাবে চিন্তা করুন: আসুন ভান করুন (সরলতার জন্য) যে স্টডআউট এবং স্টিডিনই কেবলমাত্র আমরা পড়তে এবং লিখতে পারি সেই ফাইলগুলি। অপরিহার্য ভাষায়, এটি কোনও সমস্যা নয়। তবে কার্যকরী ভাষায় আপনি বৈশ্বিক রাষ্ট্রকে পরিবর্তন করতে পারবেন না। একটি ফাংশন হ'ল এমন কিছু যা মান (বা মান) নেয় এবং একটি মান (বা মান) দেয়। এর চারপাশের একটি উপায় হ'ল গ্লোবাল স্টেটকে প্রতিটি ফাংশনের মধ্যে প্রবেশ করা এবং বাইরে যাওয়া মান হিসাবে ব্যবহার করা। সুতরাং আপনি কোডের প্রথম লাইনটি এরকম কিছুতে অনুবাদ করতে পারেন:
global_state <- (\(stdin, stdout) -> (stdin, stdout ++ "What is your name?")) global_state
... এবং সংকলকটি দ্বিতীয় উপাদানটিতে যুক্ত হওয়া যে কোনও কিছু মুদ্রণ করতে জানত global_state
। এখন আমি আপনার সম্পর্কে জানি না, তবে আমি এই জাতীয় প্রোগ্রামটিকে ঘৃণা করব। এটি যেভাবে আরও সহজ করা হয়েছিল তা হ'ল মনডস ব্যবহার করা। একটি মোনাডে, আপনি এমন একটি মান পাস করেন যা এক ক্রিয়া থেকে পরবর্তী ক্রমে কোনও ধরণের রাজ্যের প্রতিনিধিত্ব করে। এই কারণেই putStrLn
রিটার্নের ধরণ রয়েছে IO ()
: এটি নতুন গ্লোবাল রাষ্ট্রটি ফিরিয়ে দিচ্ছে।
তাহলে আপনি যত্ন কেন? ঠিক আছে, জরুরী প্রোগ্রামের তুলনায় ক্রিয়ামূলক প্রোগ্রামিংয়ের সুবিধাগুলি বেশ কয়েকটি জায়গায় মৃত্যুর জন্য বিতর্কিত হয়েছে, সুতরাং আমি সাধারণভাবে সেই প্রশ্নের উত্তর দেব না (তবে যদি আপনি কার্যকরী প্রোগ্রামিংয়ের ক্ষেত্রে মামলাটি শুনতে চান তবে এই কাগজটি দেখুন )। যদিও এই নির্দিষ্ট ক্ষেত্রে, আপনি যদি বুঝতে পেরেছেন যে হাস্কেল কী অর্জন করতে চাইছে তা সাহায্য করতে পারে।
প্রচুর প্রোগ্রামাররা মনে করেন যে হাসকল তাদের প্রয়োজনীয় কোড লিখতে বা পার্শ্ব প্রতিক্রিয়া ব্যবহার থেকে বিরত করার চেষ্টা করে। এটি বেশ সত্য নয়। এটি এইভাবে চিন্তা করুন: একটি অপরিহার্য ভাষা হ'ল ডিফল্টরূপে পার্শ্ব প্রতিক্রিয়াগুলিকে মঞ্জুরি দেয় তবে আপনি যদি সত্যিই চান তবে আপনাকে কার্যকরী কোড লেখার অনুমতি দেয় (এবং কিছু সংযোজনগুলির সাথে চুক্তি করতে রাজি হন)। হাস্কেল ডিফল্টরূপে খাঁটিভাবে কার্যকরী, তবে আপনি যদি সত্যিই চান (তবে আপনার প্রোগ্রামটি কার্যকর হতে চাইলে আপনি যা করেন) আবশ্যক কোডটি লিখতে দেয়। বিন্দুটি এমন কোড লিখতে অসুবিধা নয় যেগুলির পার্শ্ব প্রতিক্রিয়া রয়েছে। এটি নিশ্চিত করার জন্য যে আপনি পার্শ্ব প্রতিক্রিয়া (স্পষ্টতই টাইপ সিস্টেমটি প্রয়োগ করে) রাখছেন about
goto
কিছুটা পরে (কাঠামোগত প্রোগ্রামিংয়ের যুক্তি হিসাবে) বাদ দেওয়ার বিষয়ে একই কথা বলেছেন, এই জাতীয় যুক্তিগুলিকে "ফলহীন" বলে চিহ্নিত করে। এবং তবুও আমরা কেউই গোপনে goto
ফিরে আসার জন্য কামনা করি না । এটি কেবলমাত্র যে আপনি তর্ক করতে পারেন না যেগুলি goto
এটির জন্য ব্যাপকভাবে ব্যবহার করে তাদের পক্ষে এটি প্রয়োজনীয় নয়।
আমি কামড় দেব !!! নিজেরাই মনদেহগুলি হাস্কেলের পক্ষে সত্যই কোনও রেসন ডি 'না (হাস্কেলের প্রথম সংস্করণগুলিও তাদের কাছে নেই)।
আপনার প্রশ্নটি "সি ++ বলার মতো, যখন আমি সিনট্যাক্সটি দেখি, তখন আমি খুব বিরক্ত হয়ে পড়েছি temp তবে টেমপ্লেটগুলি সি ++ এর একটি উচ্চ বিজ্ঞাপনযুক্ত বৈশিষ্ট্য, তাই আমি অন্য কোনও ভাষায় একটি প্রয়োগের দিকে তাকালাম"।
একটি হাস্কেল প্রোগ্রামারের বিবর্তন একটি রসিকতা, এটি গুরুত্ব সহকারে নেওয়া উচিত নয়।
হাস্কেলের একটি প্রোগ্রামের উদ্দেশ্যে একটি মোনাড হ'ল টাইপ ক্লাস মোনাডের উদাহরণ, এটি বলা যায় যে এটি এমন একটি প্রকার যা কিছু নির্দিষ্ট সংখ্যক ক্রিয়াকলাপ সমর্থন করে। মোসাদ টাইপ শ্রেণি প্রয়োগ করে, বিশেষত সিন্টেক্সটিকাল সমর্থনগুলির জন্য হাস্কেলের বিশেষ সমর্থন রয়েছে। কার্যত ফলস্বরূপ এর ফলে কী ঘটেছিল "প্রোগ্রামেবল আধা-কোলন" হিসাবে উল্লেখ করা হয়েছে। আপনি যখন এই কার্যকারিতাটি হাস্কেলের কিছু অন্যান্য বৈশিষ্ট্যগুলির সাথে (প্রথম শ্রেণির ফাংশনগুলি, ডিফল্টরূপে অলসতা) সাথে একত্রিত করেন তখন আপনি যা পান তা হ'ল গ্রন্থাগার হিসাবে কিছু জিনিসকে সাধারণত languageতিহ্যগতভাবে ভাষা বৈশিষ্ট্য হিসাবে বিবেচনা করা হয় যা প্রয়োগ করার ক্ষমতা। আপনি উদাহরণস্বরূপ, একটি ব্যতিক্রম পদ্ধতি কার্যকর করতে পারেন। আপনি একটি লাইব্রেরি হিসাবে ধারাবাহিকতা এবং coroutines সমর্থন সমর্থন করতে পারেন। হাস্কেল, ভাষার পরিবর্তনীয় ভেরিয়েবলগুলির জন্য কোনও সমর্থন নেই:
আপনি "হতে পারে / পরিচয় / নিরাপদ বিভাগ monads ???" সম্পর্কে জিজ্ঞাসা করুন। আপনি সম্ভবত গ্রন্থাগার হিসাবে কীভাবে ব্যতিক্রম হ্যান্ডলিং (খুব সহজ, একমাত্র ব্যতিক্রম) প্রয়োগ করতে পারেন তার একটি উদাহরণ হ'ল মোনাদ is
আপনি ঠিক বলেছেন, বার্তা লিখতে এবং ব্যবহারকারীর ইনপুটটি খুব অনন্য নয়। আইও হ'ল "বৈশিষ্ট্য হিসাবে মনডস" এর একটি দুষ্টু উদাহরণ।
তবে পুনরাবৃত্তি করার জন্য, বাকী ভাষা থেকে বিচ্ছিন্ন হয়ে নিজেই একটি "বৈশিষ্ট্য" (যেমন মনডস) তাত্ক্ষণিকভাবে দরকারী হিসাবে উপস্থিত হয় না (সি ++ 0 এক্সের একটি দুর্দান্ত নতুন বৈশিষ্ট্যটি মূল্যের উল্লেখ রয়েছে, এর অর্থ এই নয় যে আপনি নিতে পারেন সেগুলি প্রসঙ্গে সি ++ ছাড়াই কারণ এটি সিনট্যাক্স আপনাকে বিরক্ত করে এবং প্রয়োজনীয়তাটি ইউটিলিটিটি দেখে)। প্রোগ্রামিং ল্যাঙ্গুয়েজ এমন কিছু নয় যা আপনি বালতিতে গুচ্ছের বৈশিষ্ট্যগুলি ছুঁড়ে ফেলে দিয়েছিলেন।
প্রোগ্রামাররা সমস্ত প্রোগ্রাম লেখেন, তবে মিলগুলি সেখানেই শেষ হয়। আমি মনে করি প্রোগ্রামাররা বেশিরভাগ প্রোগ্রামার কল্পনা করতে চেয়ে অনেক বেশি পার্থক্য করে। স্থায়ী ভেরিয়েবল টাইপিং বনাম রানটাইম-কেবল প্রকারের স্ক্রিপ্টিং বনাম সংকলিত, সি-স্টাইল বনাম বস্তু-ভিত্তিক যেকোন দীর্ঘস্থায়ী "যুদ্ধ" নিন। আপনি যুক্তিযুক্তভাবে যুক্তি দেখানো অসম্ভব বলে মনে করেন যে একটি শিবির নিম্নমানের, কারণ তাদের মধ্যে কিছু কিছু প্রোগ্রামিং সিস্টেমে চমৎকার কোডটি মন্থন করে যা আমার কাছে অর্থহীন বা এমনকি সম্পূর্ণরূপে অব্যর্থ বলে মনে হয়।
আমি মনে করি বিভিন্ন লোকেরা কেবল আলাদাভাবে চিন্তা করে, এবং যদি আপনি সিনট্যাকটিক চিনি বা বিশেষত বিমূর্ততা দ্বারা প্রলুব্ধ না হন যা কেবলমাত্র সুবিধার জন্য বিদ্যমান এবং বাস্তবে একটি উল্লেখযোগ্য রানটাইম ব্যয় থাকে, তবে সর্বত্র এই জাতীয় ভাষা থেকে দূরে থাকুন।
তবে আমি আপনাকে সুপারিশ করব যে আপনি যে ধারণাগুলি দিচ্ছেন সেগুলি দিয়ে আপনি কমপক্ষে নিজেকে পরিচিত করার চেষ্টা করুন। ল্যাম্বডা এক্সপ্রেশন সম্পর্কে বড় জিনিস কী তা তারা যতক্ষণ না বুঝতে পারে ততক্ষণ পর্যন্ত যিনি তীব্রভাবে খাঁটি-সি-প্রো-প্রো এর বিরুদ্ধে আমার কিছুই নেই । আমি সন্দেহ করি যে বেশিরভাগই তাত্ক্ষণিকভাবে অনুরাগী হয়ে উঠবে না তবে লাম্বদাসের সাথে সমাধান করা ওহ এতটা সহজ কী ছিল তা যখন তারা নিখুঁত সমস্যাটি খুঁজে পায় তখন তাদের মনের পিছনে এটি উপস্থিত থাকে।
এবং সর্বোপরি, ফ্যানবয় বক্তৃতা দ্বারা বিরক্ত হওয়ার এড়াতে চেষ্টা করুন, বিশেষত এমন লোকদের দ্বারা যারা আসলে জানেন না তারা কী সম্পর্কে কথা বলছেন।
হাস্কেল রেফারেনশিয়াল ট্রান্সপারেন্সি প্রয়োগ করে : একই পরামিতিগুলি দেওয়া, প্রতিটি ফাংশন সর্বদা একই ফল দেয়, আপনি যতক্ষণ এই ফাংশনটিকে কল করুন না কেন।
এর অর্থ হল, উদাহরণস্বরূপ, হাস্কেল-এ (এবং মোনাডস ছাড়াই) আপনি এলোমেলো সংখ্যা জেনারেটর প্রয়োগ করতে পারবেন না। সি ++ বা জাভাতে আপনি এটি করতে পারেন যে গ্লোবাল ভেরিয়েবলগুলি ব্যবহার করে, এলোমেলো জেনারেটরের মধ্যবর্তী "বীজ" মান সংরক্ষণ করে।
হাস্কেল-এ গ্লোবাল ভেরিয়েবলের প্রতিচ্ছবি হ'ল মনাদাস।
Random
বস্তুটিতে পরিবর্তনীয় ভেরিয়েবলগুলি ব্যবহার করে অভ্যন্তরীণভাবে করা হয় ।
পুরানো প্রশ্নের মতো তবে এটি সত্যিই ভাল, তাই আমি উত্তর দেব।
আপনি মনডকে কোডের ব্লক হিসাবে ভাবতে পারেন যার জন্য আপনার কীভাবে কার্যকর করা হবে তার উপর আপনার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে: কোডের প্রতিটি লাইন কী ফিরবে, কোনও লাইনে ফাঁসি কার্যকর হওয়া উচিত কিনা, প্রতিটি লাইনের মধ্যে আরও কিছু প্রক্রিয়াজাতকরণ ঘটবে কিনা।
আমি কিছু জিনিস উদাহরণ দেব যা মনডস সক্ষম করে তোলে যা অন্যথায় কঠিন হবে। এই উদাহরণগুলির কোনটিই হাস্কেলের মধ্যে নেই, কেবলমাত্র আমার হাস্কেল জ্ঞানটি কিছুটা নড়বড়ে, তবে হাস্কেল কীভাবে সন্ন্যাসীদের ব্যবহারকে অনুপ্রাণিত করেছে, তার উদাহরণ এটি।
parsers
সাধারণত, আপনি যদি কোনও প্রকারের পার্সার লিখতে চান, কোনও প্রোগ্রামিং ল্যাঙ্গুয়েজ বাস্তবায়নের জন্য বলতে হয়, আপনাকে হয় বিএনএফ স্পেসিফিকেশনটি পড়তে হবে এবং পার্স করার জন্য লুপ কোডের পুরো গোছাটি লিখতে হবে, অথবা আপনাকে একটি সংকলক সংকলক ব্যবহার করতে হবে ফ্লেক্স, বাইসন, ইয়্যাক ইত্যাদি But
পার্সারগুলি আসলে ম্যানড বা বিশেষ উদ্দেশ্যমূলক ভাষা যেমন ইয়্যাক, বাইসন ইত্যাদির সাহায্যে করা যায় না
উদাহরণস্বরূপ, আমি আইআরসি প্রোটোকলের জন্য বিএনএফ ভাষা স্পেসিফিকেশন নিয়েছি :
message = [ ":" prefix SPACE ] command [ params ] crlf
prefix = servername / ( nickname [ [ "!" user ] "@" host ] )
command = 1*letter / 3digit
params = *14( SPACE middle ) [ SPACE ":" trailing ]
=/ 14( SPACE middle ) [ SPACE [ ":" ] trailing ]
nospcrlfcl = %x01-09 / %x0B-0C / %x0E-1F / %x21-39 / %x3B-FF
; any octet except NUL, CR, LF, " " and ":"
middle = nospcrlfcl *( ":" / nospcrlfcl )
trailing = *( ":" / " " / nospcrlfcl )
SPACE = %x20 ; space character
crlf = %x0D %x0A ; "carriage return" "linefeed"
এবং এটিকে F # তে কোডের প্রায় 40 লাইনে সঙ্কুচিত করে (যা অন্য ভাষা যা মনাদদের সমর্থন করে):
type UserIdentifier = { Name : string; User: string; Host: string }
type Message = { Prefix : UserIdentifier option; Command : string; Params : string list }
let space = character (char 0x20)
let parameters =
let middle = parser {
let! c = sat <| fun c -> c <> ':' && c <> (char 0x20)
let! cs = many <| sat ((<>)(char 0x20))
return (c::cs)
}
let trailing = many item
let parameter = prefixed space ((prefixed (character ':') trailing) +++ middle)
many parameter
let command = atLeastOne letter +++ (count 3 digit)
let prefix = parser {
let! name = many <| sat (fun c -> c <> '!' && c <> '@' && c <> (char 0x20)) //this is more lenient than RFC2812 2.3.1
let! uh = parser {
let! user = maybe <| prefixed (character '!') (many <| sat (fun c -> c <> '@' && c <> (char 0x20)))
let! host = maybe <| prefixed (character '@') (many <| sat ((<>) ' '))
return (user, host)
}
let nullstr = function | Some([]) -> null | Some(s) -> charsString s | _ -> null
return { Name = charsString name; User = nullstr (fst uh); Host = nullstr (snd uh) }
}
let message = parser {
let! p = maybe (parser {
let! _ = character ':'
let! p = prefix
let! _ = space
return p
})
let! c = command
let! ps = parameters
return { Prefix = p; Command = charsString c; Params = List.map charsString ps }
}
এফ # এর মোনাদ সিনট্যাক্সটি হাস্কেলের তুলনায় বেশ কুৎসিত, এবং সম্ভবত আমি এটির কিছুটা উন্নতি করতে পারতাম - তবে বাড়ি নেওয়ার বিষয়টি কাঠামোগত, পার্সার কোডটি বিএনএফ-এর মতোই। এটি কেবল মনড (বা পার্সার জেনারেটর) ব্যতীত আরও অনেক বেশি কাজ গ্রহণ করত না, এটির নির্দিষ্টকরণের সাথে প্রায় কোনও সাদৃশ্য থাকত না, এবং পড়তে এবং বজায় রাখতে উভয়ই ভয়ানক ছিল।
কাস্টম মাল্টিটাস্কিং
সাধারণত মাল্টিটাস্কিংকে একটি ওএস বৈশিষ্ট্য হিসাবে বিবেচনা করা হয় - তবে মোনাদগুলির সাহায্যে আপনি আপনার নিজস্ব শিডিয়ুলারটি লিখতে পারেন যে প্রতিটি নির্দেশ মোডের পরে প্রোগ্রামটি শিডিয়ুলারের উপর নিয়ন্ত্রণ সঞ্চার করে, যা কার্যকর করার জন্য আরও একটি মোনাড বেছে নিতে পারে।
একজন লোক গেম লুপগুলি নিয়ন্ত্রণের জন্য একটি "টাস্ক" মোনাড তৈরি করেছে (আবার এফ # তে), যাতে প্রতিটি কলগুলিতে কাজ করে এমন একটি রাষ্ট্রীয় মেশিন হিসাবে সমস্ত কিছু লেখার পরিবর্তে Update()
তিনি কেবলমাত্র সমস্ত নির্দেশাবলী লিখতে পারেন যেন তারা একক ফাংশন ছিল ।
অন্য কথায়, কিছু করার পরিবর্তে:
class Robot
{
enum State { Walking, Shooting, Stopped }
State state = State.Stopped;
public void Update()
{
switch(state)
{
case State.Stopped:
Walk();
state = State.Walking;
break;
case State.Walking:
if (enemyInSight)
{
Shoot();
state = State.Shooting;
}
break;
}
}
}
আপনি যেমন কিছু করতে পারেন:
let robotActions = task {
while (not enemyInSight) do
Walk()
while (enemyInSight) do
Shoot()
}
লিনকিউ থেকে এসকিউএল
লিনকিউ থেকে এসকিউএল আসলে একটি মনাদের উদাহরণ এবং অনুরূপ কার্যকারিতা সহজেই হাস্কেলের মধ্যে প্রয়োগ করা যেতে পারে।
আমি এই সমস্ত সঠিকভাবে মনে রাখছি না বলে আমি বিশদগুলিতে উঠব না , তবে এরিক মাইজার এটিকে বেশ ভালভাবে ব্যাখ্যা করেছেন ।
আপনি যদি GoF প্যাটার্নগুলির সাথে পরিচিত হন তবে মনডগুলি স্ট্রয়েডগুলিতে রেডিওএকটিভ ব্যাজার দ্বারা কামড়ে ডেকরেটর প্যাটার্ন এবং বিল্ডার প্যাটার্নের মতো are
উপরে আরও ভাল উত্তর আছে, তবে আমি দেখতে পাচ্ছি কিছু নির্দিষ্ট সুবিধা:
মনডগুলি মূল প্রকারটি পরিবর্তন না করে অতিরিক্ত বৈশিষ্ট্য সহ কয়েকটি মূল প্রকারকে সজ্জিত করে। উদাহরণস্বরূপ, একটি মোনাড স্ট্রিং "উত্তোলন" করতে পারে এবং "আইস ওয়েলফোর্ডেড", "ইস্প্রফ্যানিটি" বা "ইসপালিনড্রোম" ইত্যাদির মতো মান যুক্ত করতে পারে
একইভাবে, মনডস সংগ্রহের ধরণে একটি সাধারণ প্রকারকে একত্রিত করার অনুমতি দেয়
মনাদাস এই উচ্চ-অর্ডার স্পেসে দেরী করে ফাংশনগুলিকে আবদ্ধ করার অনুমতি দেয়
মনডস উচ্চতর অর্ডার স্পেসে একটি স্বেচ্ছাসেবী তথ্য প্রকারের সাথে স্বেচ্ছাসেবী ফাংশন এবং তর্কগুলি মেশানোর অনুমতি দেয়
মনডস একটি অপরিষ্কার, রাষ্ট্রীয় বেসের সাথে খাঁটি, রাষ্ট্রবিহীন ফাংশনগুলিকে মিশ্রিত করার অনুমতি দেয়, যাতে আপনি কোথায় সমস্যা তা ট্র্যাক করে রাখতে পারেন
জাভাতে একটি মোনাডের একটি পরিচিত উদাহরণ হল তালিকা। এটি স্ট্রিংয়ের মতো কয়েকটি মূল শ্রেণি নেয় এবং এটি তালিকাটির মোনাদ স্পেসে "লিফট" করে এবং তালিকার তথ্য যোগ করে। তারপরে এটি সেই স্থানটিতে নতুন ফাংশনগুলিকে আবদ্ধ করে যেমন get (), getFirst (), যোগ (), খালি () ইত্যাদি into
বড় আকারে, কল্পনা করুন যে কোনও প্রোগ্রাম লেখার পরিবর্তে আপনি কেবল একটি বড় নির্মাতাকে লিখেছিলেন (জিওএফ প্যাটার্ন হিসাবে), এবং বিল্ড () পদ্ধতিটি শেষ পর্যন্ত প্রোগ্রামটির যেই উত্তরটি উত্থাপিত হয়েছিল তা বের করে দিয়েছে। এবং যে আপনি নিজের প্রোগ্রামবিল্ডারে মূল কোডটি পুনরায় সংশোধন না করে নতুন পদ্ধতি যুক্ত করতে পারেন। এজন্য মনাদগুলি একটি শক্তিশালী ডিজাইনের মডেল।