একটি শ্রেণীর জটিলতা হ্রাস করা


10

আমি কিছু উত্তর দেখেছি এবং গুগলে অনুসন্ধান করেছি, তবে আমি সহায়ক কিছু খুঁজে পেলাম না (যেমন, এর বিশ্রী পার্শ্ব প্রতিক্রিয়া হবে না)।

বিমূর্তভাবে আমার সমস্যাটি হ'ল আমার একটি অবজেক্ট রয়েছে এবং এটিতে অপারেশনগুলির দীর্ঘ ক্রম সম্পাদন করা দরকার ; আমি এটিকে এক ধরণের সমাবেশ লাইন, যেমন গাড়ি তৈরির মতো মনে করি।

আমি বিশ্বাস করি এই বস্তু বলে অভিহিত করা হবে পদ্ধতি অবজেক্টস

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

একক পর্বে ক্রিয়াকলাপগুলি ইতিমধ্যে স্বতন্ত্র, অর্থাত্ আমি ইতিমধ্যে তাদের একটি সাবসেট নিয়ে ঝুঁকছি যা কোনও ক্রমে কার্যকর করা হতে পারে (সামনের এবং পিছনের আসনগুলি কোনও ক্রমে ইনস্টল করা যেতে পারে)।

আমার যুক্তি বর্তমানে বাস্তবায়নের সরলতার জন্য প্রতিবিম্ব ব্যবহার করে।

এটি হ'ল, একবার আমার যখন কার্বিথআউটফ্লাস্ট্রি হয়ে যায়, তখন অবজেক্টটি परফর্মসামিং () নামক পদ্ধতিগুলির জন্য নিজেকে পরীক্ষা করে। এই মুহুর্তে এটি এই সমস্ত পদ্ধতি কার্যকর করে:

myObject.perform001SomeOperation();
myObject.perform002SomeOtherOperation();
...

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

একটি ভিন্ন উদাহরণ

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

যদি ভুক্তভোগীর কোনও পরিবার না থাকে তবে আমি এমনকি গেটইনফরমেশনআউটআউটফ্যামিলি পর্যায়ে প্রবেশ করব না, তবে আমি যদি তা করি তবে এটি প্রথমে আমি বাবা বা মা বা ভাইবোনকে লক্ষ্য করি কিনা তা অপ্রাসঙ্গিক (যদি থাকে)। তবে আমি এটি করতে পারি না যদি আমি কোনও ফ্যামিলি স্ট্যাটাসচেক না করে নিই, যা অতীতের পূর্ববর্তী পর্যায়ে অন্তর্ভুক্ত।

এটি সমস্ত আশ্চর্যজনকভাবে কাজ করে ...

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

... কিন্তু ...

সমস্যাটি দেখা দিল যখন আমি আমার পদ্ধতিগুলির একটিতে একটি শেষ অপারেশন যুক্ত করেছি, যার ফলে সামগ্রিক মডিউলটি একটি বাধ্যতামূলক জটিলতা সূচককে ছাড়িয়ে গেছে ("এন বেসরকারী পদ্ধতির চেয়ে কম")।

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

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

দ্রষ্টব্য : আমি সচেতন যে বিভিন্ন দৃষ্টিকোণ থেকে এটি মোটেও সমস্যা নয় (সম্ভাব্য পারফরম্যান্স সম্পর্কিত সমস্যাগুলি ইত্যাদি উপেক্ষা করে)। যা ঘটছে তা হ'ল একটি নির্দিষ্ট মেট্রিক অসন্তুষ্ট এবং এর পক্ষে ন্যায়সঙ্গততা রয়েছে।

কি আমি মনে করি আমি কাজ করতে পারে

প্রথমটি বাদে, এই সমস্ত বিকল্পগুলি করণীয় এবং আমি মনে করি, এটি ডিফেন্সেবল।

  • আমি যাচাই করেছেন যে, আমি গোপন হতে হবে এবং আমার অর্ধেক পদ্ধতি ডিক্লেয়ার করতে পারেন protected। তবে আমি পরীক্ষার পদ্ধতিতে দুর্বলতা ব্যবহার করব এবং ধরা পড়ার সময় নিজেকে ন্যায্যতা জানানো ছাড়াও আমি এটি পছন্দ করি না। এছাড়াও, এটি একটি স্টপগ্যাপ পরিমাপ। প্রয়োজনীয় অপারেশনগুলির সংখ্যা দ্বিগুণ হলে কী হবে? অপছন্দনীয়, তবে কি তবে?
  • আমি এ ধাপটিকে অনানলেডবজেক্টআল্ফা, আনিল্লেডজেক্ট ব্রাভো এবং অ্যানিলিয়েডবজেক্টচর্লিগুলিতে যথেচ্ছভাবে বিভক্ত করতে পারি এবং প্রতিটি পর্যায়ে অপারেশনগুলি করা হচ্ছে এক তৃতীয়াংশ have আমি এইরকম যে আসলে এই বছরের কম বয়সী হই যোগ একটি পরীক্ষা পাশ করার ছাড়া কোন লাভ সঙ্গে, জটিলতা (এন-1 এর আরও বেশি শ্রেণীর)। আমি অবশ্যই ধরে রাখতে পারি যে একটি CarWithFrontSeatsInstalled এবং একটি CarWithAllSeatsInstalled যৌক্তিকভাবে ধারাবাহিক পর্যায়। পরে আলফার দ্বারা ব্র্যাভো পদ্ধতির প্রয়োজনীয়তা হওয়ার ঝুঁকি ছোট এবং আমি এটি ভাল খেললে আরও ছোট smaller কিন্তু এখনো.
  • আমি একক মধ্যে দূরবর্তী অনুরূপ, বিভিন্ন অপারেশন গুচ্ছ করতে পারেন। performAllSeatsInstallation()। এটি কেবল স্টপগ্যাপ মাপ এবং এটি একক ক্রিয়াকলাপের জটিলতা বাড়িয়ে তোলে। আমার যদি কখনও অন্য ক্রমে A এবং B অপারেশন করার প্রয়োজন হয়, এবং আমি সেগুলি E = (A + C) এবং F (B + D) এর মধ্যে রেখেছি, আমাকে E এবং F আনবান্ডেল করতে হবে এবং চারপাশে কোডটি বদল করতে হবে ।
  • আমি ল্যাম্বদা ফাংশনগুলির একটি অ্যারে ব্যবহার করতে পারি এবং পরিষ্কারভাবে পুরোপুরি চেকটি পার্শ্ববর্তী করে রাখতে পারি, তবে আমি সেই আড়ম্বরপূর্ণ দেখতে পাই। এটি এখন পর্যন্ত সেরা বিকল্প। এটি প্রতিবিম্ব থেকে মুক্তি পাবেন। আমার যে দুটি সমস্যা রয়েছে তা হ'ল আমাকে সম্ভবত সমস্ত পদ্ধতি অবজেক্টগুলি পুনরায় লেখার জন্য বলা হবে , কেবল অনুমানক নয় CarWithEngineInstalled, এবং এটি খুব ভাল কাজের সুরক্ষা হবে, এটি আসলে এতটা আবেদন করে না; এবং কোড কভারেজ চেকারের ল্যাম্বডাসের সাথে সমস্যা রয়েছে (যা দ্রবণযোগ্য তবে এখনও )।

তাই ...

  • কোনটি, আপনি মনে করেন, আমার সেরা বিকল্প?
  • আমি কি বিবেচনা না করে আছে এর চেয়ে ভাল উপায় আছে? ( সম্ভবত আমি আরও ভাল করে পরিষ্কার হয়ে এসে সরাসরি জিজ্ঞাসা করব এটি কী? )
  • এই নকশাটি কি আশাহীনভাবে ত্রুটিযুক্ত, এবং আমি আরও ভালভাবে পরাজয় এবং খাদকে স্বীকার করব - এই আর্কিটেকচারটি পুরোপুরি? আমার ক্যারিয়ারের জন্য ভাল নয়, তবে দীর্ঘমেয়াদে খারাপ ডিজাইনের কোড লেখা আরও ভাল কিছু হতে পারে?
  • আমার বর্তমান পছন্দটি কি আসলে ওয়ান ট্রু ওয়ে এবং আরও উন্নত মানের মেট্রিক্স (এবং / অথবা উপকরণ) ইনস্টল করার জন্য আমার লড়াই করা দরকার? এই শেষ বিকল্পের জন্য আমার রেফারেন্স দরকার ... বকবক করার সময় আমি কেবল @PHB- এর দিকে হাত তুলতে পারছি না এটি আপনার অনুসন্ধান করা ম্যাট্রিক নয়আমি কতটা সক্ষম হতে চাই তা নয়

3
অথবা, আপনি "সর্বাধিক জটিলতা" সতর্কতা উপেক্ষা করতে পারেন।
রবার্ট হার্ভে

আমি যদি পারতাম তাহলে করতাম. কোনওভাবেই এই মেট্রিক্স জিনিস নিজস্ব নিজস্ব একটি পবিত্র গুণ অর্জন করেছে। আমি চেষ্টা করছি এবং পিটিবিকে তাদের একটি দরকারী সরঞ্জাম হিসাবে গ্রহণ করার জন্য বোঝাতে চেষ্টা করছি, তবে কেবল একটি সরঞ্জাম। আমি এখনও সফল হতে পারি ...
LSerni

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

2
মেট্রিকের অত্যাচার। মেট্রিকগুলি দরকারী সূচক, তবে কেন সেই মেট্রিক ব্যবহার করা হয় তা উপেক্ষা করার সময় তাদের প্রয়োগ করা কার্যকর নয়।
জয়দী

2
আপাতত লোকেদের কাছে প্রয়োজনীয় জটিলতা এবং দুর্ঘটনাজনিত জটিলতার মধ্যে পার্থক্য ব্যাখ্যা করুন। en.wikipedia.org/wiki/No_Silver_Bullet আপনি যে জটিলতা নিয়ম ভঙ্গ হয় অপরিহার্য, তারপর যদি তোমরা refactor প্রতি নিশ্চিত হন, তাহলে programmers.stackexchange.com/a/297414/51948 আপনি সম্ভবত প্রায় নিয়ম স্কেটিং করছি এবং ছড়িয়ে জটিলতা বাইরে। যদি পর্যায়ক্রমে জিনিসগুলি encapsulating স্বতঃস্ফূর্ত না হয় (পর্যায়গুলি সমস্যার সাথে সম্পর্কিত) এবং পুনরায় নকশার বিকাশকারীদের কোড বজায় রাখার জন্য জ্ঞানীয় লোড হ্রাস করে, তবে এটি এটি করা বোধগম্য।
Fuhrmanator

উত্তর:


15

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

আপনার গাড়ী সমাবেশ উদাহরণ নির্মাণের জন্য, Carশ্রেণীর কল্পনা করুন :

public class Car
{
    public IChassis Chassis { get; private set; }
    public Dashboard { get; private set; }
    public IList<Seat> Seats { get; private set; }

    public Car()
    {
        Seats = new List<Seat>();
    }

    public void AddChassis(IChassis chassis)
    {
        Chassis = chassis;
    }

    public void AddDashboard(Dashboard dashboard)
    {
        Dashboard = dashboard;
    }
}

আমি উপাদান, মত কিছু বাস্তবায়নের ছেড়ে যাচ্ছি IChassis, Seatএবং Dashboardসংক্ষিপ্ততা অনুরোধে জন্য।

Carনিজেই নির্মাণের জন্য দায়ী নয়। সমাবেশ লাইনটি, সুতরাং আসুন এটি একটি শ্রেণিতে আবদ্ধ করুন:

public class CarAssembler
{
    protected List<IAssemblyPhase> Phases { get; private set; }

    public CarAssembler()
    {
        Phases = new List<IAssemblyPhase>()
        {
            new ChassisAssemblyPhase(),
            new DashboardAssemblyPhase(),
            new SeatAssemblyPhase()
        };
    }

    public void Assemble(Car car)
    {
        foreach (IAssemblyPhase phase in Phases)
        {
            phase.Assemble(car);
        }
    }
}

এখানে গুরুত্বপূর্ণ পার্থক্যটি হ'ল CarAssembler এর সমাবেশ ফেজ অবজেক্টগুলির একটি তালিকা রয়েছে যা প্রয়োগ করে IAssemblyPhase। আপনি এখন সর্বজনীন পদ্ধতিগুলির সাথে সুস্পষ্টভাবে আচরণ করছেন, যার অর্থ প্রতিটি পর্বটি নিজেই পরীক্ষা করা যায় এবং আপনার কোড মানের সরঞ্জামটি আরও সুখী কারণ আপনি একটি একক শ্রেণিতে এত বেশি স্টাফ করছেন না। সমাবেশ প্রক্রিয়া খুব সহজ মারা গেছে। Assembleগাড়িতে করে পর্যায়ক্রমে লুপ করুন এবং কল দিয়ে যাবেন । সম্পন্ন. IAssemblyPhaseইন্টারফেস এছাড়াও কেবলমাত্র একটি পাবলিক পদ্ধতি যে একটি গাড়ি বস্তুর লাগে সঙ্গে মৃত সহজ:

public interface IAssemblyPhase
{
    void Assemble(Car car);
}

এখন আমাদের প্রতিটি নির্দিষ্ট পর্যায়ে এই ইন্টারফেসটি বাস্তবায়ন করার জন্য আমাদের কংক্রিট ক্লাসগুলির প্রয়োজন:

public class ChassisAssemblyPhase : IAssemblyPhase
{
    public void Assemble(Car car)
    {
        car.AddChassis(new UnibodyChassis());
    }
}

public class DashboardAssemblyPhase : IAssemblyPhase
{
    public void Assemble(Car car)
    {
        Dashboard dashboard = new Dashboard();

        dashboard.AddComponent(new Speedometer());
        dashboard.AddComponent(new FuelGuage());
        dashboard.Trim = DashboardTrimType.Aluminum;

        car.AddDashboard(dashboard);
    }
}

public class SeatAssemblyPhase : IAssemblyPhase
{
    public void Assemble(Car car)
    {
        car.Seats.Add(new Seat());
        car.Seats.Add(new Seat());
        car.Seats.Add(new Seat());
        car.Seats.Add(new Seat());
    }
}

প্রতিটি পর্যায়ে স্বতন্ত্রভাবে সহজ হতে পারে। কিছু মাত্র একটি লাইনার হয়। কিছু হয়তো চারটি আসন যুক্ত করে অন্ধ করছেন, এবং অন্যটিকে গাড়ীতে যুক্ত করার আগে ড্যাশবোর্ডটি কনফিগার করতে হবে। এই দীর্ঘ অঙ্কিত প্রক্রিয়াটির জটিলতাটি একাধিক, পুনরায় ব্যবহারযোগ্য শ্রেণিতে বিভক্ত যা সহজেই টেস্টযোগ্য।

যদিও আপনি বলেছেন যে এখনই অর্ডারটি গুরুত্বপূর্ণ নয়, ভবিষ্যতে এটি হতে পারে।

এটি শেষ করতে, আসুন গাড়ি একত্র করার প্রক্রিয়াটি দেখুন:

Car car = new Car();
CarAssembler assemblyLine = new CarAssembler();

assemblyLine.Assemble(car);

আপনি নির্দিষ্ট শ্রেণীর গাড়ি বা ট্রাককে একত্রিত করতে CarAssembler উপ-শ্রেণী করতে পারেন। কোডটি পুনরায় ব্যবহার করা সহজতর করে প্রতিটি পর্ব বৃহত্তর সম্পূর্ণর মধ্যে একটি ইউনিট।


এই নকশাটি কি আশাহীনভাবে ত্রুটিযুক্ত, এবং আমি আরও ভালভাবে পরাজয় এবং খাদকে স্বীকার করব - এই আর্কিটেকচারটি পুরোপুরি? আমার ক্যারিয়ারের জন্য ভাল নয়, তবে দীর্ঘমেয়াদে খারাপ ডিজাইনের কোড লেখা আরও ভাল কিছু হতে পারে?

আমি যা লিখেছি তা নতুন করে লেখার দরকার যদি সিদ্ধান্ত নেওয়া আমার ক্যারিয়ারের একটি কালো চিহ্ন ছিল, তবে আমি এখনই খাদের খননকারীর কাজ করব, এবং আপনার আমার কোনও পরামর্শ নেওয়া উচিত নয়। :)

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

আমার বর্তমান পছন্দটি কি আসলে ওয়ান ট্রু ওয়ে এবং আরও উন্নত মানের মেট্রিক্স (এবং / অথবা উপকরণ) ইনস্টল করার জন্য আমার লড়াই করা দরকার?

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


1
হ্যাঁ, এক godশ্বরের ক্লাস করার পরে আরও ভাল।
BЈовић

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

@ ডেভিডপ্যাকার: এমনকি আপনার যদি একগুচ্ছ স্টাফকে প্যারামিটারাইজ করতে হয় তবে আপনি যে কোনও কনফিগার ক্লাসে আপনার "এসেম্বলার" অবজেক্টের কনস্ট্রাক্টরে পাস করতে পারবেন তা এনকেপুলেট করতে পারেন। এই গাড়ির উদাহরণে, পেইন্টের রঙ, অভ্যন্তরের রঙ এবং উপকরণ, ট্রিম প্যাকেজ, ইঞ্জিন এবং আরও অনেকগুলি কাস্টমাইজ করা যেতে পারে তবে অগত্যা আপনার 150 কাস্টমাইজেশন থাকবে না। আপনার কাছে সম্ভবত এক ডজন বা তার বেশি সময় থাকবে, যা একটি বিকল্প অবজেক্টে নিজেকে ধার দেয়।
গ্রেগ বার্গার্ড্ট

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

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

1

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


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

1

কোনওভাবে সমস্যা আমাকে নির্ভরতা স্মরণ করিয়ে দেয়। আপনি একটি নির্দিষ্ট কনফিগারেশন একটি গাড়ী চান। গ্রেগ বার্গার্ড্টের মতো, আমি প্রতিটি পদক্ষেপ / আইটেম /… এর জন্য অবজেক্ট / ক্লাস নিয়ে যেতে চাই।

প্রতিটি পদক্ষেপ ঘোষণা করে যে এটি কী মিশ্রণে যুক্ত করে (এটি কী provides) (একাধিক জিনিস হতে পারে), তবে এটির জন্য কী প্রয়োজন।

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

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

অবশেষে, আপনার গাড়িটি তৈরি করার পরে সেখানে সম্ভাব্য পদক্ষেপগুলি হ্রাস পাবে এবং কারবিল্ডারকে প্রয়োজনীয় পদক্ষেপগুলি বের করতে দিন।

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


0

আপনি উল্লেখ করেছেন এমন কয়েকটি বিষয় আমার কাছে 'খারাপ' বলে বিবেচিত

"আমার যুক্তি বর্তমানে বাস্তবায়নের সরলতার জন্য প্রতিবিম্ব ব্যবহার করে"

সত্যিই এটির জন্য কোনও অজুহাত নেই। কী চালাতে হবে তা নির্ধারণ করতে আপনি কী পদ্ধতিটির নামের সাথে স্ট্রিং তুলনা ব্যবহার করছেন ?! অর্ডার পরিবর্তন করলে কি পদ্ধতির নাম পরিবর্তন করতে হবে ?!

"একটি একক পর্যায়ে কার্যক্রম ইতিমধ্যে স্বতন্ত্র"

যদি তারা একে অপরের সাথে সত্যই স্বাধীন হয় তবে এটি পরামর্শ দেয় যে আপনার শ্রেণি একাধিক দায়িত্ব নিয়েছে। আমার কাছে, আপনার উভয় উদাহরণই নিজেকে একরকম একককে leণ হিসাবে দেখায়

MyObject.AddComponent(IComponent component) 

এমন পদ্ধতির সাহায্যে যা প্রতিটি প্রতিবাদের পক্ষে যুক্তিটিকে তার নিজস্ব শ্রেণী বা শ্রেণিতে বিভক্ত করতে দেয়।

প্রকৃতপক্ষে আমি কল্পনা করি তারা সত্যিকার অর্থে স্বতন্ত্র নয়, আমি কল্পনা করি যে প্রত্যেকে বস্তুর অবস্থা পরীক্ষা করে এটি পরিবর্তন করে, বা কমপক্ষে কিছুটা আগে বৈধতা শুরু করার আগে সম্পাদন করে।

এই ক্ষেত্রে আপনি হয় করতে পারেন:

  1. উইন্ডোটিকে বাইরে ফেলে দিন এবং এমন পরিষেবা আছে যা আপনার ক্লাসে উন্মুক্ত ডেটাতে কাজ করে।

    পরিষেবা.আড্ডুর টুকার (গাড়ী গাড়ি)

  2. একটি বিল্ডার ক্লাস রাখুন যা প্রয়োজনীয় ডেটা একত্রিত করে এবং পূর্বে সম্পূর্ণ বস্তুটি পাস করে আপনার অবজেক্টটি তৈরি করে।

    গাড়ী = CarBuilder.WithDoor ()। With With Dood ()। With Wheel ();

(সাথে এক্স যুক্তি আবার সাব-বিল্ডারে বিভক্ত হতে পারে)

  1. ফাংশনাল অ্যাপ্রোচ নিন এবং কোনও সংশোধন পদ্ধতিতে ফাংশন / ডেলগেটগুলি পাস করুন

    কার.মোডিফাই ((সি) => সি.ডোরস ++);


ইয়ান বলেছেন: "উইন্ডোটি বাইরে ফেলে দিন, এবং আপনার ক্লাসে উদ্ভাসিত ডেটাগুলিতে কাজ করে এমন পরিষেবা আছে" --- এটি কীভাবে বস্তু-ভিত্তিক নয়?
গ্রেগ বার্গার্ড্ট

?? তার না, তার একটি অ OO যেমন পণ্য বিকল্প
ইওয়ান

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

এটি 'ওও নয়' কারণ আপনি ডেটাটি এমনভাবে প্রকাশ করছেন যেন এটি কোনও কাঠামো এবং কোনও পদ্ধতির মতো আলাদা শ্রেণিতে এটি পরিচালনা করে
ইওয়ান

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