"লিকি বিমূর্তি" শব্দটির অর্থ কী? (দয়া করে উদাহরণ সহ ব্যাখ্যা করুন I
"লিকি বিমূর্তি" শব্দটির অর্থ কী? (দয়া করে উদাহরণ সহ ব্যাখ্যা করুন I
উত্তর:
এখানে একটি মিটস্পেস উদাহরণ:
অটোমোবাইলগুলির ড্রাইভারগুলির বিমূর্ততা রয়েছে। এর শুদ্ধতম আকারে একটি স্টিয়ারিং হুইল, এক্সিলারেটর এবং ব্রেক রয়েছে। এই বিমূর্তনটি হুডের নীচে কী রয়েছে সে সম্পর্কে অনেকগুলি বিবরণ লুকায়: ইঞ্জিন, ক্যামস, টাইমিং বেল্ট, স্পার্ক প্লাগ, রেডিয়েটর ইত্যাদি under
এই বিমূর্ততা সম্পর্কে পরিষ্কার জিনিস হ'ল আমরা ব্যবহারকারীর পুনরায় প্রশিক্ষণ না দিয়েই প্রয়োগের অংশগুলি উন্নত অংশগুলির সাথে প্রতিস্থাপন করতে পারি। ধরা যাক আমরা বিতরণকারী ক্যাপটি বৈদ্যুতিন ইগনিশন দ্বারা প্রতিস্থাপন করি এবং আমরা স্থির ক্যামকে পরিবর্তনশীল ক্যামের সাথে প্রতিস্থাপন করি। এই পরিবর্তনগুলি পারফরম্যান্সের উন্নতি করে তবে ব্যবহারকারী এখনও চাকাটি নিয়ে চালিত করে এবং প্যাডালগুলি শুরু করতে এবং থামাতে ব্যবহার করে।
এটি আসলে বেশ লক্ষণীয় ... একটি 16 বছর বয়সের বা একটি 80 বছর বয়সী এই জটিল টুকরোটি যন্ত্রপাতিটি পরিচালনা করতে পারে এটি ভিতরে কীভাবে কাজ করে তা সম্পর্কে সত্যতা না জেনে!
তবে ফাঁস আছে। সংক্রমণটি একটি ছোট ফুটো। একটি স্বয়ংক্রিয় সংক্রমণে আপনি গাড়িটি গিয়ারগুলি স্যুইচ করার সাথে সাথে এক মুহুর্তের জন্য শক্তি হারাতে পারেন, যখন সিভিটি-তে আপনি পুরো পথটি মসৃণ টর্ক অনুভব করেন।
আরও বড় ফুটো আছে। আপনি যদি ইঞ্জিনটি খুব দ্রুত পুনরুদ্ধার করেন তবে আপনি এটির ক্ষতি করতে পারেন। ইঞ্জিন ব্লকটি খুব ঠান্ডা থাকলে গাড়িটি শুরু না হতে পারে বা এটির খারাপ অভিনয় হতে পারে। এবং যদি আপনি একই সময়ে রেডিও, হেডলাইট এবং এসি ক্র্যাঙ্ক করেন তবে আপনি দেখবেন আপনার গ্যাসের মাইলেজটি নেমে যেতে চলেছে।
এর সহজ অর্থ হ'ল আপনার বিমূর্ততা প্রয়োগের কিছু বিবরণ উন্মোচিত করে বা বিমূর্ততা ব্যবহার করার সময় আপনার প্রয়োগের বিবরণ সম্পর্কে সচেতন হওয়া দরকার। এই শব্দটি দ্য জোয়েল স্পলস্কি , দ্য ২০০২ সালে দায়ী করা হয়েছে more আরও তথ্যের জন্য উইকিপিডিয়া নিবন্ধটি দেখুন।
একটি ক্লাসিক উদাহরণ নেটওয়ার্ক লাইব্রেরি যা আপনাকে দূরবর্তী ফাইলগুলিকে স্থানীয় হিসাবে বিবেচনা করে। এই বিমূর্তিটি ব্যবহার করে বিকাশকারী অবশ্যই অবগত থাকতে হবে যে স্থানীয় সমস্যাগুলি স্থানীয় ফাইলগুলি না করে এমনভাবে ব্যর্থ হতে পারে network তারপরে আপনাকে নেটওয়ার্ক লাইব্রেরি সরবরাহ করে এমন বিমূর্ততার বাইরে বিশেষত ত্রুটিগুলি পরিচালনা করতে কোড বিকাশ করতে হবে।
উইকিপিডিয়া কোনো রয়েছে বেশ ভাল সংজ্ঞা এই জন্য
একটি ফাঁস বিমূর্ততা কোনও বাস্তবায়িত বিমূর্ততা বোঝায়, জটিলতা হ্রাস করার (বা আড়াল করা) উদ্দেশ্যে, যেখানে অন্তর্নিহিত বিবরণগুলি সম্পূর্ণ গোপন নয়
অথবা সফ্টওয়্যারের জন্য অন্য কথায় এটি যখন আপনি প্রোগ্রামের সীমাবদ্ধতা বা পার্শ্ব প্রতিক্রিয়াগুলির মাধ্যমে কোনও বৈশিষ্ট্যের বাস্তবায়ন বিশদটি পর্যবেক্ষণ করতে পারেন।
একটি দ্রুত উদাহরণ হ'ল সি # / ভিবি. নেট ক্লোজার এবং রেফ / আউট প্যারামিটারগুলি ক্যাপচারে তাদের অক্ষমতা। উত্তোলন প্রক্রিয়াটি কীভাবে ঘটে তার একটি বাস্তবায়নের বিশদ দ্বারা এগুলি ধরা যায় না তার কারণ। এটি করার আরও ভাল উপায় আছে তা বলার অপেক্ষা রাখে না।
নেট নেট বিকাশকারীদের সাথে পরিচিত একটি উদাহরণ এখানে: এএসপি.এনইটি Page
ক্লাস এইচটিটিপি অপারেশনগুলির বিশদ বিশেষত ফর্ম ডেটা পরিচালনার বিবরণ গোপন করার চেষ্টা করে যাতে বিকাশকারীদের পোস্ট মানগুলির সাথে ডিল করতে না হয় (কারণ এটি স্বয়ংক্রিয়ভাবে সার্ভারে ফর্মের মানগুলি মানচিত্র করে) নিয়ন্ত্রণ)।
তবে আপনি যদি সর্বাধিক প্রাথমিক ব্যবহারের পরিস্থিতিগুলি অতিক্রম করে Page
বিমূর্ততা ফাঁস শুরু হয় এবং ক্লাসের প্রয়োগের বিশদটি না বুঝে পৃষ্ঠাগুলি নিয়ে কাজ করা শক্ত হয়ে যায়।
একটি সাধারণ উদাহরণ একটি পৃষ্ঠায় গতিশীলভাবে নিয়ন্ত্রণ যুক্ত করা - আপনি সঠিক সময়ে যোগ না করা হলে গতিশীলভাবে যুক্ত কন্ট্রোলগুলির মানটি আপনার জন্য ম্যাপ করা যায় না : অন্তর্নিহিত ইঞ্জিনটি আসন্ন ফর্মের মানগুলিকে উপযুক্ত নিয়ন্ত্রণগুলিতে ম্যাপ করার আগে। যখন আপনাকে এটি শিখতে হবে, বিমূর্ততা ফাঁস হয়েছে ।
ভাল, একভাবে এটি নিখুঁত তাত্ত্বিক জিনিস, যদিও গুরুত্বহীন নয়।
জিনিসগুলি বোঝা সহজ করার জন্য আমরা বিমূর্ততা ব্যবহার করি। আমি স্বতন্ত্র আইটেমের অক্ষরের একটি আদেশযুক্ত সেট নিয়ে কাজ করছি এই সত্যটি লুকানোর জন্য আমি কোনও ভাষার স্ট্রিং ক্লাসে পরিচালনা করতে পারি। আমি সংখ্যার সাথে কাজ করছি এই সত্যটি লুকানোর জন্য আমি একটি আদেশযুক্ত অক্ষরের সেট নিয়ে কাজ করি। আমি 1s এবং 0 এর সাথে লেনদেন করছি এই সত্যটি লুকানোর জন্য আমি সংখ্যার সাথে চুক্তি করি।
একটি ফাঁসী বিমূর্ততা হ'ল এটি যা গোপন করে তার বিবরণ গোপন করে না। যদি জাভা বা .NET- তে 5-অক্ষরের স্ট্রিংয়ে কল স্ট্রিং করুন en একটি চরিত্রের .5। বিমূর্ততা ফাঁস হয়েছে। যদিও এটি ফাঁস না করার অর্থ দৈর্ঘ্য সন্ধানের জন্য হয় আরও স্টোরেজ স্পেসের প্রয়োজন হয় (আসল দৈর্ঘ্য সংরক্ষণের জন্য) অথবা ও (1) থেকে ও (এন) হয়ে যাবে (আসল দৈর্ঘ্যটি কী তা নির্ধারণ করতে)। যদি আমি আসল উত্তরের বিষয়ে চিন্তা করি (প্রায়শই আপনি সত্যই করেন না) আপনার সত্যিকারের যা চলছে তা জ্ঞান নিয়ে কাজ করা দরকার।
আরও বিতর্কযোগ্য কেসগুলির ক্ষেত্রে ঘটে থাকে যেখানে কোনও পদ্ধতি বা সম্পত্তি আপনাকে অভ্যন্তরীণ কর্মস্থলে প্রবেশ করতে দেয়, সেগুলি অ্যাবস্ট্রাকশন ফাঁস, বা বিমূর্ততার নিম্ন স্তরে সরে যাওয়ার সু-সংজ্ঞায়িত উপায়, কখনও কখনও এমন বিষয় হতে পারে যেগুলি সম্পর্কে দ্বিমত নেই।
আমি আরপিসি ব্যবহার করে উদাহরণ দেওয়ার শিরাতে অবিরত থাকব।
আরপিসির আদর্শ বিশ্বে, একটি রিমোট পদ্ধতি কলটি স্থানীয় পদ্ধতি কলের মতো দেখতে পাওয়া উচিত (বা গল্পটি যায়)। এটি প্রোগ্রামারটির কাছে সম্পূর্ণ স্বচ্ছ হওয়া উচিত যে যখন তারা ফোন করে SomeObject.someFunction()
তাদের স্থানীয় ধারণা SomeObject
(অথবা কেবলমাত্র someFunction
সেই বিষয়টির জন্য) স্থানীয়ভাবে সংরক্ষণ করা হয় বা কার্যকর হয় বা দূরবর্তীভাবে সংরক্ষণ করা হয় এবং কার্যকর করা হয় তবে তাদের কোনও ধারণা নেই । তত্ত্বটি বলে যে এটি প্রোগ্রামিংকে সহজ করে তোলে।
বাস্তবতা পৃথক কারণ স্থানীয় ফাংশন কল করার (যদিও আপনি বিশ্বের সবচেয়ে ধীরে ধীরে ব্যাখ্যার ভাষা ব্যবহার করছেন) এবং এর মধ্যে বিশাল পার্থক্য রয়েছে:
একক সময়ে এটি প্রায় তিনটি অর্ডার (বা আরও বেশি!) মাত্রার পার্থক্য। এই তিনটি + মাত্রার অর্ডারগুলি পারফরম্যান্সে একটি বিশাল পার্থক্য আনতে চলেছে যা আপনার পদ্ধতি বিলোপ করার প্রক্রিয়া কল ফাঁস করে দেবে বরং স্পষ্টতই প্রথমবার আপনি ভুলভাবে কোনও RPC কে আসল ফাংশন কল হিসাবে আচরণ করবেন। আপনার কোডটিতে গুরুতর সমস্যাগুলি বাদ দিয়ে প্রকৃত ফাংশন কলটির বাস্তবায়ন বাগগুলির বাইরে খুব কম ব্যর্থতা পয়েন্ট থাকবে। একটি আরপিসি কলটিতে নিম্নলিখিত সমস্ত সম্ভাব্য সমস্যা রয়েছে যা আপনি নিয়মিত স্থানীয় কল থেকে প্রত্যাশা করতে চান এবং তার উপরে ব্যর্থতার মামলা হিসাবে আরও কম হয়ে যাবেন:
সুতরাং এখন আপনার আরপিসি কল যা "স্থানীয় ফাংশন কলের মতো" কেবলমাত্র স্থানীয় ফাংশন কল করার সময় আপনার যে অতিরিক্ত ব্যর্থতার শর্তগুলির সাথে লড়াই করতে হবে না তার পুরো বোতল রয়েছে। বিমূর্ততা আবার আরও ফাঁস, আরও শক্ত।
শেষ পর্যন্ত আরপিসি একটি খারাপ বিমূর্ততা কারণ এটি প্রতিটি স্তরে চালুনির মতো ফাঁস হয় - যখন সফল হয় এবং উভয় ক্ষেত্রেই ব্যর্থ হয়।
মধ্যে একটি উদাহরণ জ্যাঙ্গো অনেক সাথে অধিকের উদাহরণ ORM :
স্যাম্পল এপিআই ব্যবহারে লক্ষ্য করুন যে আপনাকে বহু থেকে বহুগুণে গুণাবলীতে পাবলিকেশন অবজেক্ট যুক্ত করতে পারার আগে বেইস আর্টিকেল এ 1 সংরক্ষণ করতে হবে। এবং লক্ষ্য করুন যে বহু থেকে বহু বৈশিষ্ট্য আপডেট করা অবিলম্বে অন্তর্নিহিত ডাটাবেসে সংরক্ষণ করে, যখন একটি একক বৈশিষ্ট্য আপডেট করা .save () না বলা পর্যন্ত ডিবিতে প্রতিফলিত হয় না।
বিমূর্ততাটি হ'ল আমরা একটি অবজেক্ট গ্রাফ নিয়ে কাজ করছি, যেখানে একক মানের বৈশিষ্ট্য এবং বহু-মান বৈশিষ্ট্যগুলি কেবলমাত্র বৈশিষ্ট্য। কিন্তু বাস্তব সম্পর্কিত ডেটাবেস ব্যাকড ডেটা স্টোর ফাঁস হয়ে যায় ... যেহেতু আরডিবিএসের অখণ্ডতা সিস্টেমটি কোনও অবজেক্ট ইন্টারফেসের পাতলা ভিনিয়ারের মাধ্যমে প্রদর্শিত হয়।
বিমূর্ততা বিশ্বকে সহজ করার একটি উপায়। এর অর্থ এটি হুডের নীচে বা পর্দার আড়ালে আসলে কী ঘটছে সে সম্পর্কে আপনাকে চিন্তা করার দরকার নেই। এর অর্থ কোনও কিছু বোকা প্রমাণ।
বিমানগুলি খুব জটিল যন্ত্রের টুকরো। আপনার কাছে জেট ইঞ্জিন, অক্সিজেন সিস্টেম, বৈদ্যুতিক সিস্টেম, ল্যান্ডিং গিয়ার সিস্টেম ইত্যাদি রয়েছে তবে পাইলটকে জেট ইঞ্জিনের জটিলতা সম্পর্কে উদ্বিগ্ন হওয়ার দরকার নেই..এটি সমস্ত "বিমূর্ত" দূরে রয়েছে। এর অর্থ হ'ল বিমানের চালককে বিমানের চালনার বিষয়ে কেবলমাত্র উদ্বেগের দরকার: বাম দিকে যেতে বাম এবং ডানদিকে যেতে ডানদিকে যেতে, উন্নতি অর্জনের জন্য টানুন এবং নীচে নামার জন্য চাপ দিন।
এটি যথেষ্ট সহজ ...... আসলে আমি মিথ্যা বলেছি: স্টিয়ারিং হুইলকে নিয়ন্ত্রণ করা কিছুটা জটিল। আদর্শ বিশ্বে, পাইলটকেই কেবল উদ্বিগ্ন হওয়া উচিত । তবে বাস্তবে এটি ঘটেনি: আপনি যদি কোনও বিমান কীভাবে পরিচালনা করেন, বা বাস্তবায়নের কোনও বিবরণ সম্পর্কে কোনও বাস্তব ধারণা না রেখে বানরের মতো বিমানটি উড়ান, তবে আপনি সম্ভবত বোর্ডে থাকা সবাইকে বিধ্বস্ত করে হত্যা করবেন।
বাস্তবে, একজন পাইলটকে প্রচুর গুরুত্বপূর্ণ বিষয় নিয়ে চিন্তা করতে হবে - সবকিছুই বিমূর্ত করা হয়নি: পাইলটদের বাতাসের গতি, জোর, আক্রমণের কোণ, জ্বালানী, উচ্চতা, আবহাওয়ার সমস্যা, উত্সের কোণ এবং এই সম্পর্কে উদ্বিগ্ন হতে হবে পাইলট সঠিক দিকে যাচ্ছে। কম্পিউটারগুলি এই কাজগুলিতে পাইলটকে সহায়তা করতে পারে তবে সবকিছু স্বয়ংক্রিয়ভাবে / সরলীকৃত হয় না।
উদাহরণস্বরূপ, যদি পাইলটটি কলামটিতে খুব শক্তভাবে টানেন - বিমানটি মানবে, তবে পাইলট বিমানটি আটকে রাখার ঝুঁকি নিয়ে ফেলবে এবং একবার স্থবির হয়ে গেলে, মাটিতে ফিরে নামার আগে এটির নিয়ন্ত্রণ ফিরে পাওয়া শক্তিশালী is ।
অন্য কথায়, পাইলটের পক্ষে স্টিয়ারিং হুইলকে অন্য কিছু না জেনে নিয়ন্ত্রণ করা যথেষ্ট নয় ........... নূও ....... তাকে অবশ্যই বিমানের অন্তর্নিহিত ঝুঁকি এবং সীমাবদ্ধতা সম্পর্কে জানতে হবে। তিনি উড়ে যাওয়ার আগে ....... বিমানটি কীভাবে কাজ করে এবং বিমানটি কীভাবে উড়ে যায় তা অবশ্যই তাকে জানতে হবে; তার অবশ্যই বাস্তবায়ন বিশদ জেনে রাখা উচিত ..... তাকে অবশ্যই জানতে হবে যে খুব বেশি টান টানলে একটি স্টল বাড়ে বা খুব খাড়াভাবে অবতরণ বিমানটি ধ্বংস করে দেবে।
এই জিনিসগুলি বিমূর্ত করা হয় না। প্রচুর জিনিস বিমূর্ত করা হয়, কিন্তু সব কিছুই না। পাইলটটির কেবল স্টিয়ারিং কলাম, এবং সম্ভবত একটি বা দুটি অন্যান্য বিষয় নিয়ে চিন্তা করা দরকার। বিমূর্ততাটি "ফুটো"।
...... এটি আপনার কোডে একই জিনিস। যদি আপনি অন্তর্নিহিত বাস্তবায়ন বিশদটি জানেন না, তবে প্রায়শই না জানা আপনি নিজেকে একটি কোণায় কাজ করবেন।
এখানে কোডিংয়ের একটি উদাহরণ রয়েছে:
ওআরএম ডাটাবেস প্রশ্নগুলির সাথে লেনদেন করতে অনেক ঝামেলা বিমূর্ত করে, তবে আপনি যদি কখনও এরকম কিছু করেন তবে:
User.all.each do |user|
puts user.name # let's print each user's name
end
তারপরে আপনি উপলব্ধি করতে পারবেন যে যদি আপনি কয়েক মিলিয়ন ব্যবহারকারীর বেশি পেয়ে থাকেন তবে আপনার অ্যাপ্লিকেশনটি মেরে ফেলার একটি দুর্দান্ত উপায়। সবকিছু বিমূর্ত হয় না। আপনার জানা দরকার যে User.all
25 মিলিয়ন ব্যবহারকারীর সাথে কল করা আপনার মেমরির ব্যবহারকে আরও বাড়িয়ে তুলবে এবং সমস্যা তৈরি করতে চলেছে। আপনার কিছু অন্তর্নিহিত বিশদ জানতে হবে। বিমূর্ততা ফুটো হয়।
এটি এমন যে কোনও সময়ে , যা আপনার স্কেল এবং সম্পাদন দ্বারা পরিচালিত হবে, আপনার বিমূর্ততা কাঠামোর প্রয়োগের বিশদগুলির সাথে আপনার পরিচিত হওয়া প্রয়োজন কারণ এটি কেন এটি আচরণ করে।
উদাহরণস্বরূপ, এই SQL
প্রশ্নটি বিবেচনা করুন :
SELECT id, first_name, last_name, age, subject FROM student_details;
এবং এর বিকল্প:
SELECT * FROM student_details;
এখন, তারা যুক্তিসঙ্গত সমতুল্য সমাধানগুলির মতো দেখায় তবে পৃথক কলামের নাম নির্দিষ্টকরণের কারণে প্রথমটির পারফরম্যান্স আরও ভাল।
এটি একটি তুচ্ছ উদাহরণ কিন্তু শেষ পর্যন্ত এটি জোয়েল স্পলস্কির উদ্ধৃতিতে ফিরে আসে:
সমস্ত অ-তুচ্ছ বিমূর্ততা কিছুটা অবধি ফাঁস হয়।
এক পর্যায়ে, যখন আপনি আপনার ক্রিয়াকলাপে একটি নির্দিষ্ট স্কেলে পৌঁছে যাবেন, আপনি আপনার ডিবি (এসকিউএল) যেভাবে কাজ করেন তা অনুকূল করতে চাইবে। এটি করতে, আপনাকে কীভাবে সম্পর্কিত ডেটাবেসগুলি কাজ করে তা জানতে হবে। শুরুতে এটি আপনার কাছে বিমূর্ত ছিল, তবে এটি ফাঁস। আপনার এটি কোনও সময়ে শিখতে হবে।
ধরুন, আমাদের একটি লাইব্রেরিতে নিম্নলিখিত কোড রয়েছে:
Object[] fetchDeviceColorAndModel(String serialNumberOfDevice)
{
//fetch Device Color and Device Model from DB.
//create new Object[] and set 0th field with color and 1st field with model value.
}
গ্রাহক যখন এপিআই কল করেন তখন তারা একটি বস্তু পান []। গ্রাহককে বুঝতে হবে যে অবজেক্ট অ্যারের প্রথম ক্ষেত্রটির রঙ মান এবং দ্বিতীয় ক্ষেত্রটি হল মডেল মান। এখানে বিমূর্ততা গ্রাহক কোডে লাইব্রেরি থেকে ফাঁস হয়েছে।
সমাধানগুলির মধ্যে একটি হ'ল কোনও অবজেক্টটি ফিরিয়ে আনা যা ডিভাইসের মডেল এবং রঙকে সজ্জিত করে। গ্রাহক মডেল এবং রঙের মান পেতে সেই বস্তুকে কল করতে পারেন।
DeviceColorAndModel fetchDeviceColorAndModel(String serialNumberOfTheDevice)
{
//fetch Device Color and Device Model from DB.
return new DeviceColorAndModel(color, model);
}
ফাঁস বিমূর্ততা সবই এনক্যাপসুলেটরিং স্টেট সম্পর্কে। ফুটো বিমূর্তনের খুব সাধারণ উদাহরণ:
$currentTime = new DateTime();
$bankAccount1->setLastRefresh($currentTime);
$bankAccount2->setLastRefresh($currentTime);
$currentTime->setTimestamp($aTimestamp);
class BankAccount {
// ...
public function setLastRefresh(DateTimeImmutable $lastRefresh)
{
$this->lastRefresh = $lastRefresh;
} }
এবং সঠিক উপায় (ফাঁস বিমূর্ততা নয়):
class BankAccount
{
// ...
public function setLastRefresh(DateTime $lastRefresh)
{
$this->lastRefresh = clone $lastRefresh;
}
}
আরও বিবরণ এখানে ।