বিমূর্তনের স্তর কীভাবে নির্ধারণ করবেন


35

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

আমার প্রশ্ন বিমূর্তির স্তর নির্ধারণের মানদণ্ড কী?

আমি বই থেকে অনুচ্ছেদ উদ্ধৃত:

আমাদের ফাংশনগুলি "একটি জিনিস" করছে কিনা তা নিশ্চিত করার জন্য আমাদের নিশ্চিত করতে হবে যে আমাদের ফাংশনের মধ্যে থাকা বিবৃতিগুলি বিমূর্তির একই স্তরে রয়েছে। তালিকাটি 3-1 কীভাবে এই বিধি লঙ্ঘন করে তা সহজেই দেখা যায়। সেখানে এমন ধারণাগুলি রয়েছে যা খুব উচ্চ স্তরের বিমূর্তকরণে রয়েছে, যেমন getHtml (); অন্য যেগুলি বিমূর্তির মধ্যবর্তী স্তরে রয়েছে যেমন: স্ট্রিং পেজপ্যাথনাম = পথপার্সার.রেেন্ডার (পেজপাথ); এবং এখনও অন্যরা যারা উল্লেখযোগ্যভাবে নিম্ন স্তরের, যেমন:। অ্যাপেন্ড ("\ n")।


উত্তর:


27

লেখক ব্যাখ্যা করেছেন যে অংশটি "টপ টু বটম অব রিডিং কোড" উপচ্ছেদে যে বিমূর্ততা (শ্রেণিবদ্ধ ইন্ডেন্টেশন খনি) সম্পর্কে আলোচনা করা হয়েছে:

[...] আমরা প্রোগ্রামটি এমনভাবে পড়তে সক্ষম হতে চাই যেহেতু এটি TO অনুচ্ছেদের একটি সেট ছিল , যার মধ্যে প্রতিটি বিমূর্ততার বর্তমান স্তর বর্ণনা করছে এবং পরবর্তী স্তরটিতে পরবর্তী TO অনুচ্ছেদে রেফারেন্স করছে ।

  • সেটআপগুলি এবং টিয়ারডাউনগুলি অন্তর্ভুক্ত করতে আমরা সেটআপগুলি অন্তর্ভুক্ত করি, তারপরে আমরা পরীক্ষার পৃষ্ঠার সামগ্রীটি অন্তর্ভুক্ত করি এবং তারপরে টিয়ারডাউনগুলি অন্তর্ভুক্ত করি।
    • সেটআপগুলি অন্তর্ভুক্ত করতে আমরা স্যুট সেটআপটি অন্তর্ভুক্ত করি যদি এটি স্যুট হয় তবে আমরা নিয়মিত সেটআপটি অন্তর্ভুক্ত করি।
      • স্যুট সেটআপ অন্তর্ভুক্ত করার জন্য, আমরা "স্যুটসেটআপ" পৃষ্ঠাটির জন্য পিতামাতার শ্রেণিবিন্যাস অনুসন্ধান করি এবং সেই পৃষ্ঠাটির পথ সহ একটি অন্তর্ভুক্ত বিবৃতি যুক্ত করি।
        • পিতামাতাকে অনুসন্ধান করতে ...

এর সাথে যে কোডটি যেতে চাইবে তা এরকম কিছু হবে:

public void CreateTestPage()
{
    IncludeSetups();
    IncludeTestPageContent();
    IncludeTeardowns();
}

public void IncludeSetups()
{
    if(this.IsSuite())
    {
        IncludeSuiteSetup();
    }

    IncludeRegularSetup();
}

public void IncludeSuiteSetup()
{
    var parentPage = FindParentSuitePage();

    // add include statement with the path of the parentPage
}

ইত্যাদি। প্রতিবার আপনি যখন ক্রিয়াকলাপের স্তরক্রম আরও গভীর করে যান, আপনার বিমূর্ততার স্তরটি পরিবর্তন করা উচিত। উপরের উদাহরণে IncludeSetups, IncludeTestPageContentএবং IncludeTeardownsসমস্ত বিমূর্ততার একই স্তরে।

বইটিতে প্রদত্ত উদাহরণে, লেখকের পরামর্শ দিচ্ছে যে বড় ফাংশনটি খুব নির্দিষ্ট আকারে বিভক্ত করা উচিত এবং কেবল একটি কাজ করা উচিত। যদি সঠিকভাবে করা হয়, তবে রিফ্যাক্টরড ফাংশনটি এখানে উদাহরণগুলির সাথে মিল দেখায়। (রিফ্যাক্টরড সংস্করণটি বইয়ের 3-7 তালিকায় দেওয়া আছে।)


10

আমার মনে হয় এই প্রশ্নটি বুঝতে, আপনাকে একটি বিমূর্ততা কী তা বুঝতে হবে। (আমি একটি আনুষ্ঠানিক সংজ্ঞা খুঁজে পেতে খুব অলস, তাই আমি নিশ্চিত যে আমি ডাইনিং হতে চলেছি, তবে এখানে যায় ...) আপনি যখন কোনও জটিল বিষয়, বা সত্তা নেন এবং এর বেশিরভাগ বিবরণ লুকান তখন একটি বিমূর্ততা হয় কার্যকারিতা প্রকাশ করার সময় যে এখনও অবজেক্টের মর্ম সংজ্ঞা দেয়।

আমি বিশ্বাস করি বইটি আপনাকে যে উদাহরণ দিয়েছে তা একটি বাড়ি ছিল। আপনি যদি বাড়ির দিকে খুব বিশদ নজর দেন তবে দেখতে পাবেন যে এটি বোর্ড, নখ, জানালা, দরজা দিয়ে তৈরি ... তবে ফটোগ্রাফের পাশের একটি বাড়ির কার্টুন অঙ্কন এখনও একটি বাড়ি রয়েছে, যদিও এটি নিখোঁজ রয়েছে এই বিবরণ অনেক।

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

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

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

লেখক আপনাকে যা করতে বলছেন তা হ'ল আপনি যখন ক্লাস বা ফাংশনটি সংজ্ঞায়িত করেন, আপনি কোন স্তরটি সে সম্পর্কে ভাবেন। আপনার যদি এমন কোনও শ্রেণি থাকে যা সাবসিস্টেম এবং ব্যবহারকারী সামগ্রী পরিচালনা করে, একই শ্রেণিতে নিম্ন স্তরের স্ট্রিং ম্যানিপুলেশন করা উচিত নয় বা কেবল সকেট কল করার জন্য পুরো ভেরিয়েবলগুলি থাকা উচিত। এটি অ্যাবস্ট্রাকশন স্তরগুলি অতিক্রম করা লঙ্ঘন এবং একটি শ্রেণি / ফাংশন কেবলমাত্র একটি কাজ করা (এসআরপি - একক দায়িত্বের নীতি) রয়েছে।


2

আমার প্রশ্ন বিমূর্তির স্তর নির্ধারণের মানদণ্ড কী?

বিমূর্ত স্তরটি সুস্পষ্ট বলে মনে করা হচ্ছে। এটি অ্যাবস্ট্রাক্ট যদি এটি সমস্যা ডোমেনের অংশ - প্রোগ্রামিং ভাষার অংশ না। "অত্যন্ত বিমূর্ত" == "বাস্তব নয়" == "সমস্যা ডোমেন" এর চেয়ে আরও পরিষ্কার হওয়া শক্ত। এবং "বিমূর্ত নয় == কংক্রিট == ভাষার অংশ"। বিমূর্ত স্তরটি সিদ্ধান্ত নিতে এটি তুচ্ছ বলে মনে করা হচ্ছে। মোটেই কোনও সূক্ষ্মতা থাকার কথা নেই।

.append("\n")বিমূর্ত নয়। এটি কেবল একটি স্ট্রিংয়ের মধ্যে একটি অক্ষর রাখে। এটা কংক্রিট হবে। বিমূর্ত নয়।

String pagePathName = PathParser.render(pagePath);স্ট্রিংসের সাথে ডিল করে। কংক্রিট জিনিস। আংশিকভাবে কংক্রিট প্রোগ্রামিং ভাষার বৈশিষ্ট্যগুলিতে। আংশিকভাবে বিমূর্ত "পথ" এবং "পার্সার" ধারণার সাথে কাজ করা।

getHtml(); সারাংশ। "মার্কআপ" এবং এমন জিনিসগুলি যা তুচ্ছ, কংক্রিট, ভাষার বৈশিষ্ট্যগুলি সহ নয় De

বিমূর্তি == কোনও ভাষা বৈশিষ্ট্য নয়।

কংক্রিট == একটি ভাষা বৈশিষ্ট্য।


1
আপনি যদি অ্যাবস্ট্রাক্টকে এমন কোনও গুণ হিসাবে সংজ্ঞায়িত করেন যা কোনও প্রোগ্রামার তৈরি করে সেই জিনিসগুলিকে অর্থাৎ প্রোগ্রামার-উত্পাদিত বিমূর্ততা বর্ণনা করে তবে আমি আপনার শব্দের সংজ্ঞাগুলির সাথে একমত হতে আগ্রহী। তবে সমস্ত প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি আরও কংক্রিটের জন্য বিমূর্ততা। প্রোগ্রামিং ল্যাঙ্গুয়েজের পছন্দটি নির্ধারণ করে যে আপনি কোন স্তরের বিমূর্ততা শুরু করবেন large
রবার্ট হার্ভে

1

আমি মনে করি বিমূর্তির স্তরটি সহজ ... যদি কোডের লাইনটি পদ্ধতিটির একক দায়িত্ব সরাসরি প্রয়োগ না করে তবে এটি বিমূর্তির আরেকটি স্তর। উদাহরণস্বরূপ, যদি আমার পদ্ধতির নাম সেভ চ্যাঞ্জডকাস্টমার্স () হয় এবং পরামিতি হিসাবে সমস্ত গ্রাহকদের একটি তালিকা নেয়, তবে তালিকা পরিবর্তন করা হয়েছে এমন কোনও গ্রাহককে সংরক্ষণ করার একক দায়িত্ব হ'ল:

foreach(var customer in allCustomers)
{
    if (CustomerIsChanged(customer)
        customer.Save();
}

প্রায়শই, গ্রাহকআইএসজেঞ্জড () পদ্ধতিটি কল করার পরিবর্তে, আপনি গ্রাহক ফোরচ লুপটিতে এম্বেড থাকা পরিবর্তন করেছেন কিনা তা নির্ধারণ করার জন্য আপনি যুক্তি খুঁজে পাবেন। গ্রাহকের রেকর্ড পরিবর্তন হয়েছে কিনা তা নির্ধারণ করা এই পদ্ধতির দায় নয়! এটি বিমূর্ততার একটি আলাদা স্তর। কিন্তু যদি সেই দৃ determination় সংকল্পটি করার যুক্তিটি কেবল কোডের এক লাইন হয়? কিছু যায় আসে না !!! এটি বিমূর্ততার একটি আলাদা স্তর এবং এই পদ্ধতির বাইরে হওয়া দরকার।

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