কোড পুনরাবৃত্তি বনাম বহু দায়বদ্ধ পদ্ধতি


11

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

DoAction1();
DoAction2();

if (value)
    DoAction3();

DoAction4();

কোনও পদ্ধতিতে এই জাতীয় কোড উত্তোলনের সর্বোত্তম উপায় কী এবং এটির নামকরণ কীভাবে?


1
কেন তারা আলাদা অর্থবহ পদ্ধতিতে উত্তোলন করতে প্রতিরোধী?
চন্দ্রনশু

সমস্ত ক্রিয়া সম্পর্কিত কিছু করে না। আমি লিখি করতে হবে: void MethodThatDoAction1ThenAction2AndAction3IfValueAndThenAction4()। আমি বরং আরও অর্থ দেখতে হবে: CodeBlock1()
y

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

1
যদি এটি কোনও সান্ত্বনা থাকে তবে দীর্ঘ শ্রেণীর নামের জন্য স্প্রিং বিজয়ী AbstractInterruptibleBatchPreparedStatementSetterযা আপনার পদ্ধতির চেয়ে কেবলমাত্র ছোট t
চন্দ্রনশু

1
@ চন্দ্রনশু আমি বিশ্বাস করি যে আপনার মন্তব্য (গুলি) এই প্রশ্নের উত্তর হিসাবে ঠিক কাজ করবে।
সাইমন ফারসবার্গ

উত্তর:


13

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

যদি এটি কোনও সান্ত্বনা থাকে তবে দীর্ঘ শ্রেণীর নামের জন্য স্প্রিং বিজয়ী AbstractInterruptibleBatchPreparedStatementSetterযা 49 টি অক্ষরে দাঁড়িয়েছে।


11

প্রকৃতপক্ষে আপনি একজন প্রোগ্রামার - নামকরণ থিংস দ্বারা করা সবচেয়ে কঠিন কাজটি ভোগ করছেন । এই জাতীয় পরিবর্তনের জন্য দুঃখিত তবে আমি প্রতিরোধ করতে পারিনি। আপনি দেখতে পাচ্ছেন যে অনেক লোক এ থেকে ভোগেন , এমনকি ইন্টারনেটেও আপনি এই জাতীয় প্রবন্ধটি খুঁজে পেতে পারেন ।

এখন যদি আপনার পুনরাবৃত্তিমূলক কোডগুলি একসাথে এক কাজ করে এবং সেই পদ্ধতিগুলি অন্য পদ্ধতি দ্বারা ব্যবহার করা হচ্ছে না তবে সেগুলি কেবল হেল্পার্স পদ্ধতি এবং তারপরে ফলস্বরূপ পদ্ধতির নামকরণ করা যেতে পারে doXXXবা makeXXX... আমার মনে হয় আপনি পয়েন্টটি পেয়েছেন।

চন্দ্রানশু যেমন বলেছিলেন "আপনি যদি এটি [...] অর্থ পুনরাবৃত্তি করছেন এবং এটি একটি নাম দিন"। বিন্দু এবং উপযুক্ত।

এখানে চিত্র বর্ণনা লিখুন

পিক সৌজন্যে: কোডচিফ ফেসবুক পৃষ্ঠা ছবি


2

আমি মনে করি আপনি কোড পুনরাবৃত্তি নীতিটি খুব দূরে নিচ্ছেন। কোড পুনরাবৃত্তি এড়ানোর পয়েন্টটি ভাবুন। মূল বক্তব্যটি হ'ল যুক্তির কোনও পরিবর্তন হওয়ার সময় যে কোডটি যাচাই করতে হবে তা হ্রাস করা এবং স্পষ্টতই অনুরূপ ব্লকগুলি বের করে বোঝা বাড়াতে হবে।

পুনরাবৃত্তি এড়ানোর জন্য ফ্যাক্টরিংয়ের অবক্ষয়গুলি হ'ল যদি ভাগ করা ব্লকের কোনও একটি পরিবর্তন করতে হয় তবে এখন আপনার আরও জটিল উত্তরাধিকার বা মানক এবং মানহীন বাস্তবায়নের মধ্যে কিছু পরিবর্তন প্রয়োজন।

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

এই পুনরাবৃত্তি কোড বজায় রাখার সময়, যেমন আরো জটিল হয়ে যায় এবং আপনার সমস্যা ডোমেইন আরো সংজ্ঞায়িত হয়ে, তারপর আপনি এটি আরো ফ্যাক্টর যথাযথ, পুনরাবৃত্তি এখন আরো জটিল, কিন্তু খুঁজে পেতে পারেন এছাড়াও আরো সংজ্ঞায়িত বিভাগে বাইরে।

আমি সাধারণত কিছুক্ষণ টেক্সট-সম্পাদক একই-নেস বজায় রাখার চেষ্টা করি যতক্ষণ না আমি দেখতে পাচ্ছি যে পুনরাবৃত্তিযোগ্য বলে মনে হচ্ছে এমন কিছু ফ্যাক্টরিং হিসাবে প্রমাণিত হয় কিনা। আমি কেবল পুনরাবৃত্তিটি রেখেছি, তবে পরে এটির সাথে সামঞ্জস্য করার পক্ষে পাঠ্যগতভাবে সহজ রেখে আমি এই ব্লকের ভবিষ্যতের দিকে নজর রাখছি।

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

আমার কাছে মনে হচ্ছে আপনি যদি ফ্যাক্টরটি তৈরি করতে চেষ্টা করছেন লোকেরা যদি ফ্যাক্টর চেষ্টা করে, তবে আমাদের কাছে Do1Then2If2False Do1IfTrueDo2 এর মতো মূল্যহীন রচনাগুলির একটি সম্পূর্ণ গ্রন্থাগার থাকবে।

এটি আরও জটিল এবং আরও স্পষ্ট করতে হয়েছে যে ব্লকটি ফ্যাক্টরিংয়ের আওতায় আনার জন্য পরিবর্তিত হচ্ছে না।

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


আমি সেই অংশটি পছন্দ করি যা কোড পুনরাবৃত্তির সারাংশ বের করে: যুক্তির কোনও পরিবর্তন ঘটে যখন কোডটি পরীক্ষা করতে হয় তার পরিমাণ হ্রাস করতে
y

1

আপনি যদি সত্যই একক দায়িত্বের নীতি অনুসরণ করেন তবে এই ব্লকের কোডটির কিছু নির্দিষ্ট উদ্দেশ্য থাকতে হবে, তাই না? অন্যথায় এই পদ্ধতিগুলি পৃথক শ্রেণিতে পড়ত।

তাহলে, এই কোড ব্লকটির উদ্দেশ্য কী? এটি নির্ধারণ করুন এবং আপনার একটি নাম নিয়ে আসতে সক্ষম হওয়া উচিত।

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


1

আমার এমন পরিস্থিতি হয়েছিল যা আপনার মতো হতে পারে:

এখানে একটি শ্রেণি রয়েছে যা এটির প্রতিনিধিত্ব করে এমন বস্তুর কার্যকারিতা নির্ধারণ করে:

class Functionality
{
protected:
void functionA();
void functionB();
...
void functionZ();
}

তারপরে একটি শ্রেণি রয়েছে যা উচ্চ-স্তরের ক্রিয়াকলাপের জন্য কর্মপ্রবাহকে সংজ্ঞায়িত করে যা বস্তুটি সম্পাদন করে:

class Workflows: private Functionality
{
    void WorkflowA()
    {
        functionA();

        if (m_bValue) {
            functionB();
        }

        functionC();
    }
    ...
    void WorkflowB();
}

আপনি যদি একইরকম পরিস্থিতিতে থাকেন তবে আপনার ক্লাসগুলি কী উপস্থাপন করে তা চিহ্নিত করুন (এক্ষেত্রে কার্যকারিতা / কর্মপ্রবাহ) এবং তারপরে সেই পদ্ধতিগুলির নাম দিন।

দাবি অস্বীকার: এই উদাহরণে ব্যবহৃত শ্রেণীর নামগুলি গুরুতরভাবে ভুল, তবে পদ্ধতির নামগুলি একটি সূত্র দেয়। বিচক্ষণ পরামর্শ দেওয়া।

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