ক্লিন কোডে অতিরিক্ত প্যারামিটার ব্লকের অতিরিক্ত লাইন


33

প্রসঙ্গ

ইন ক্লিন কোড , পৃষ্ঠা 35, এটা বলে

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

আমি সম্পূর্ণরূপে সম্মতি জানাই, এটি অনেক অর্থবোধ করে।

পরে 40 পৃষ্ঠায় এটি ফাংশন আর্গুমেন্ট সম্পর্কে বলে

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

আমি সম্পূর্ণরূপে সম্মতি জানাই, এটি অনেক অর্থবোধ করে।

সমস্যা

যাইহোক, বরং প্রায়শই আমি নিজেকে অন্য তালিকা থেকে একটি তালিকা তৈরি করতে দেখি এবং আমাকে দুটি খারাপের মধ্যে একটিতে বাঁচতে হবে।

হয় আমি ব্লকে দুটি লাইন ব্যবহার করি , একটি জিনিস তৈরির জন্য, একটিতে এটির ফলাফল যুক্ত করার জন্য:

    public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
    {
        List<Flurp> flurps = new List<Flurp>();
        foreach (BadaBoom badaBoom in badaBooms)
        {
            Flurp flurp = CreateFlurp(badaBoom);
            flurps.Add(flurp);
        }
        return flurps;
    }

অথবা আমি তালিকার জন্য ফাংশনে যুক্তি যুক্ত করব যেখানে জিনিসটি যুক্ত হবে, এটি "একটি যুক্তি আরও খারাপ" করে তুলেছে।

    public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
    {
        List<Flurp> flurps = new List<Flurp>();
        foreach (BadaBoom badaBoom in badaBooms)
        {
            CreateFlurpInList(badaBoom, flurps);
        }
        return flurps;
    }

প্রশ্ন

আমি কি দেখতে পাচ্ছি না এমন (সুবিধাগুলি) সুবিধাগুলি রয়েছে, যা তাদের মধ্যে একটিকে সাধারণভাবে পছন্দনীয় করে তোলে? বা নির্দিষ্ট পরিস্থিতিতে যেমন সুবিধা আছে; সেক্ষেত্রে সিদ্ধান্ত নেওয়ার সময় আমার কী সন্ধান করা উচিত?


58
এর সাথে কী হয়েছে flurps.Add(CreateFlurp(badaBoom));?
16:24

47
না, এটি কেবল একটি বিবৃতি statement এটি কেবল একটি তুচ্ছ নেস্টেড এক্সপ্রেশন (একক নেস্টেড স্তর)। এবং যদি কোনও সাধারণ f(g(x))আপনার স্টাইল-গাইডের বিরুদ্ধে হয় তবে ভাল, আমি আপনার স্টাইল-গাইডটি ঠিক করতে পারি না। মানে আপনি sqrt(x*x + y*y)চারটি লাইনে বিভক্ত হন না , তাই না? এবং এটি তিনটি (!) অভ্যন্তরীণ নেস্টিং স্তরের (হাঁফ!) নেস্টেড সুবে এক্সপ্রেশনগুলি। আপনার লক্ষ্যটি পঠনযোগ্যতা হওয়া উচিত , একক অপারেটরের বিবৃতি নয়। আপনি যদি পরে চান তবে ভাল, আমার কাছে আপনার জন্য নিখুঁত ভাষা রয়েছে: এসেমব্লার।
16:16

6
@ কেমাস্টার এমনকি x86 সমাবেশে কঠোরভাবে একক-অপারেটর বক্তব্য নেই। মেমোরি অ্যাড্রেসিং মোডগুলিতে অনেকগুলি জটিল ক্রিয়াকলাপ অন্তর্ভুক্ত থাকে এবং পাটিগণিতের জন্য ব্যবহার করা যেতে পারে - আসলে, আপনি কেবলমাত্র x86 movনির্দেশাবলী এবং jmp toStartশেষে একক ব্যবহার করে একটি টুরিং-সম্পূর্ণ কম্পিউটার তৈরি করতে পারেন । কেউ আসলে একটি সংকলক তৈরি করেছিলেন যা হুবহু এটি করে: ডি
লুয়ান

5
@ লুয়ান পিপিসিতে কুখ্যাত rlwimiনির্দেশের বিষয়ে কথা বলবেন না । (এর অর্থ দাঁড়ান রোটেট বাম ওয়ার্ড ইমিডিয়েট মাস্ক ইনসার্ট।) এই কমান্ডটি পাঁচটি অপারেন্ড (দুটি নিবন্ধক এবং তিনটি তাত্ক্ষণিক মান) এর চেয়ে কম নেয় নি এবং এটি নিম্নলিখিত ক্রিয়াকলাপ সম্পাদন করেছে: একটি নিবন্ধের বিষয়বস্তু তাত্ক্ষণিক শিফট দ্বারা আবর্তিত হয়েছিল, একটি মাস্ক ছিল 1 টি বিটগুলির একক রান দিয়ে তৈরি হয়েছিল যা অন্য দুটি তাত্ক্ষণিক ক্রিয়াকলাপ দ্বারা নিয়ন্ত্রিত ছিল এবং অন্যান্য রেজিস্টার অপারেণ্ডের সেই মুখোশটিতে 1 বিটের সাথে সংযুক্ত বিটগুলি ঘোরানো নিবন্ধের সংশ্লিষ্ট বিটগুলির সাথে প্রতিস্থাপন করা হয়েছিল। খুব দুর্দান্ত নির্দেশনা :-)
16:52

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

উত্তর:


104

এই নির্দেশিকা মানচিত্র নয়, একটি কম্পাস। তারা আপনাকে বুদ্ধিমান দিক নির্দেশ করে । তবে তারা আপনাকে নিখুঁত পদে বলতে পারে না যে সমাধানটি "সেরা"। কিছু সময়ে, আপনার কম্পাসটি যে দিকে নির্দেশ করছে সে দিকে চলতে হবে, কারণ আপনি নিজের গন্তব্যে পৌঁছেছেন।

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

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

যদি এটি আরও ভাল করা সম্ভব হয় তবে এটি উল্লেখ করে যে "সমস্ত উপাদানকে একটি তালিকা থেকে অন্য তালিকায় রূপান্তর করা" একটি সাধারণ প্যাটার্ন যা প্রায়শই বিমূর্তভাবে দূরে রাখা যায়, ক্রিয়ামূলক map()ক্রিয়াকলাপ ব্যবহার করে। সি # তে, আমি মনে করি এটি বলা হয়েছিল Select। এটার মতো কিছু:

public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
{
    return badaBooms.Select(BadaBoom => CreateFlurp(badaBoom)).ToList();
}

7
কোডটি এখনও ভুল, এবং এটি অর্থহীনভাবে চাকাটিকে পুনরায় সজ্জিত করে। CreateFlurps(someList)ছাত্রলীগ আগে থেকেই সরবরাহ করলে কেন কল করবেন someList.ConvertAll(CreateFlurp)?
বেন ভয়েগট

44
@ BenVoigt এটি একটি নকশা-স্তরের প্রশ্ন। আমি সঠিক সিনট্যাক্স নিয়ে উদ্বিগ্ন , বিশেষত যেহেতু হোয়াইটবোর্ডে কোনও সংকলক নেই (এবং আমি সর্বশেষে '09 তে সি # লিখেছি)। আমার বক্তব্যটি "আমি সেরা সম্ভাব্য কোডটি দেখিয়েছি" তা নয় তবে "একদিকে যেমন এটি ইতিমধ্যে সমাধান করা একটি সাধারণ প্যাটার্ন" solved লিনক এটি করার একটি উপায়, আপনি যে রূপান্তরটি উল্লেখ করেছেন অন্যটি । বিকল্পটি পরামর্শ দেওয়ার জন্য আপনাকে ধন্যবাদ।
আমন

1
আপনার উত্তরটি বোধগম্য, তবে লিনকিউ যুক্তিটিকে দূরে সরিয়ে দিয়েছে এবং সমস্ত মন্তব্য আপনার পরামর্শের বিরোধী বলে মনে হচ্ছে বলে বিবৃতিটিকে এক লাইনে হ্রাস করেছে। পার্শ্ব নোট হিসাবে, BadaBoom => CreateFlurp(badaBoom)নিরর্থক; আপনি CreateFlurpসরাসরি ফাংশন হিসাবে পাস করতে পারেন ( Select(CreateFlurp))। (যতদূর আমি জানি, এটি সর্বদা ক্ষেত্রে ছিল।)
jpmc26

2
নোট করুন যে এটি সম্পূর্ণভাবে পদ্ধতির প্রয়োজনটিকে সরিয়ে দেয়। নামটি CreateFlurpsআসলে দেখার চেয়ে আরও বিভ্রান্তিকর এবং বোঝা শক্ত badaBooms.Select(CreateFlurp)। দ্বিতীয়টি সম্পূর্ণরূপে ঘোষণামূলক - পচে যাওয়ার কোনও সমস্যা নেই এবং তাই কোনও পদ্ধতির প্রয়োজন নেই।
কার্ল লেথ

1
@ আর.শ্মিটজ এটি বোঝা শক্ত নয় , তবে এটির চেয়ে কম বোঝা সহজbadaBooms.Select(CreateFlurp) । আপনি একটি পদ্ধতি তৈরি করেন যাতে এর নাম (উচ্চ স্তর) এর বাস্তবায়নের জন্য দাঁড়ায় (নিম্ন স্তর)। এই ক্ষেত্রে তারা একই স্তরে রয়েছে, তাই ঠিক কী ঘটছে তা জানতে আমাকে কেবল পদ্ধতিটি দেখুন (এটি ইনলাইনটি দেখার পরিবর্তে)। CreateFlurps(badaBooms)আশ্চর্য রাখতে পারে, কিন্তু badaBooms.Select(CreateFlurp)পারে না। এটি বিভ্রান্তিকর কারণ এটি ভ্রান্তভাবে একটিটির Listপরিবর্তে একটি চাইছে IEnumerable
কার্ল লেথ

61

কোনও ক্রিয়াকলাপের জন্য আর্গুমেন্টের আদর্শ সংখ্যা শূন্য (নীলাদিক)

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

আপনার কোড সম্পর্কিত, আপনার প্রথম উদাহরণটিতে কেবল দুটি লাইনে ব্লক রয়েছে কারণ আপনি প্রথম লাইনে একটি স্থানীয় ভেরিয়েবল তৈরি করছেন। এই নিয়োগটি সরান, এবং আপনি এই পরিষ্কার কোড নির্দেশিকাগুলি মেনে চলেছেন:

public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
{
    List<Flurp> flurps = new List<Flurp>();
    foreach (BadaBoom badaBoom in badaBooms)
    {
        flurps.Add(CreateFlurp(badaBoom));
    }
    return flurps;
}

তবে এটি খুব দীর্ঘ ওয়াইন্ড (সি #) কোড। কেবল এটি হিসাবে করুন:

IEnumerable<Flurp> CreateFlurps(IEnumerable<BadaBoom> badaBooms) =>
    from badaBoom in babaBooms select CreateFlurp(badaBoom);

14
শূন্য আর্গুমেন্ট সহ একটি ফাংশন বলতে বোঝানো হয় যে অবজেক্টটি প্রয়োজনীয় ডেটা এনপ্যাপুলেট করে না যে কোনও বস্তুর বাইরে বিশ্বব্যাপী অবস্থায় জিনিসগুলি বিদ্যমান।
রাইথাল

19
@ রাইথাল, দুটি পয়েন্ট: (1) আপনি যদি পদ্ধতিগুলির বিষয়ে কথা বলছেন তবে বেশিরভাগ (সমস্ত?) ওও ভাষাগুলির জন্য, সেই বস্তুকে প্রথম পরামিতি হিসাবে অনুমান করা হয় (বা স্পষ্টভাবে বলা হয়েছে) para জাভা, সি # ইত্যাদি ক্ষেত্রে সমস্ত পদ্ধতি কমপক্ষে একটি প্যারামিটার সহ ফাংশন। সংকলকটি কেবল আপনার কাছ থেকে সেই বিবরণটি গোপন করে। (২) আমি কখনই "গ্লোবাল" উল্লেখ করি নি। উদাহরণস্বরূপ অবজেক্টের অবস্থা কোনও পদ্ধতির বাহ্যিক।
ডেভিড আরনো

17
আমি খুব নিশ্চিত, যখন চাচা বব "শূন্য" লিখেছিলেন তখন তার অর্থ "শূন্য (এটি গণনা করা হয়নি)"।
ডক ব্রাউন

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

8
@ আলেসান্দ্রো টেরুজি, আদর্শটি একটি প্যারামিটার। শূন্য খুব কম। এ কারণেই, উদাহরণস্বরূপ, কার্যকরী ভাষাগুলি কারিঙের উদ্দেশ্যে প্যারামিটারের সংখ্যা হিসাবে একটি গ্রহণ করে (আসলে কিছু কার্যকরী ভাষায়, সমস্ত ফাংশনে হুবহু একটি প্যারামিটার থাকে: আর নেই; কম নয়)। শূন্য প্যারামিটারগুলির সাথে কারি করা অযৌক্তিক হবে। "আদর্শ যতটা সম্ভব কম, এগারো শূন্যই সেরা" উল্লেখ করে হ্রাস কমানোর বিজ্ঞাপনের উদাহরণ ।
ডেভিড আরনো

19

'ক্লিন কোড' পরামর্শ সম্পূর্ণ ভুল।

আপনার লুপে দুটি বা ততোধিক লাইন ব্যবহার করুন। কোনও ফাংশনে একই দুটি লাইন লুকিয়ে রাখলে তা বোঝা যায় যখন সেগুলি কিছু এলোমেলো গণিত হয় যার বিবরণ প্রয়োজন তবে লাইনগুলি ইতিমধ্যে বর্ণনামূলক হলে এটি কিছুই করে না। 'তৈরি করুন' এবং 'যুক্ত করুন'

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

public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
    {
        List<Flurp> flurps = new List<Flurp>();
        foreach (BadaBoom badaBoom in badaBooms)
        {
            flurps.Add(badaBoom .CreateFlurp());
            //or
            badaBoom.AddToListAsFlurp(flurps);
            //or
            flurps.Add(new Flurp(badaBoom));
            //or
            //make flurps a member of the class
            //use linq.Select()
            //etc
        }
        return flurps;
    }

অথবা

foreach(var flurp in ConvertToFlurps(badaBooms))...

যেমনটি অন্যদের দ্বারা উল্লিখিত হয়েছে, সর্বোত্তম ফাংশনটি কোনও যুক্তি ছাড়াই এক হ'ল পরামর্শটি ওওপি-র কাছে সবচেয়ে খারাপ এবং স্পষ্টত খারাপ পরামর্শকে সবচেয়ে খারাপভাবে পাঠানো হয়


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

দুঃখিত, আমি আপনার প্রশ্নের ব্যাখ্যাটি ব্যাখ্যা করেছি কারণ প্রথমটি ছিল 'স্বাভাবিক' উপায়, তবে আপনাকে দ্বিতীয়টিতে ঠেলা দেওয়া হচ্ছে। আমি সাধারণভাবে ক্লিন-কোড বিরোধী নই, তবে এই উক্তিটি স্পষ্টতই ভুল
ইওয়ান

19
@ আর.স্কিমেটজ আমি নিজেই "ক্লিন কোড" পড়েছি এবং সেই বইটি যা বলে তার বেশিরভাগটি আমি অনুসরণ করি। যাইহোক, নিখুঁত ফাংশন আকার সম্পর্কে একক বিবৃতি বেশ প্রায়, এটি ঠিক সাধারণ ভুল। একমাত্র প্রভাব, এটি স্প্যাগেটি কোডকে ভাত কোডে পরিণত করে। পাঠক তুচ্ছ কাজগুলিতে বহু লোকের কাছে হারিয়ে যায় যা কেবল যখন এক সাথে দেখা হয় তখনই বোধগম্য অর্থ তৈরি করে। মানুষের একটি সীমিত কাজের স্মৃতি ক্ষমতা রয়েছে এবং আপনি বিবৃতিতে বা ফাংশন সহ ওভারলোড করতে পারেন। আপনি পঠনযোগ্য হতে চাইলে আপনাকে অবশ্যই দুজনের মধ্যে ভারসাম্য বজায় রাখতে হবে। চরম এড়ানো!
মাসের

@ কাস্টমস্টার উত্তরটি কেবল প্রথম 2 অনুচ্ছেদ ছিল যখন আমি এই মন্তব্যটি লিখেছিলাম। এটি এতক্ষণে আরও ভাল উত্তর।
আর স্মিটজ

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

15

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

এবং আমি তৃতীয়, সেরা, বিকল্পটি দিচ্ছি:

public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
{
    return badaBooms.Select(CreateFlurp).ToList();
}

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


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

10

একটি আর্গুমেন্ট সংস্করণ ভাল, তবে মূলত যুক্তি সংখ্যার কারণে নয়।

এটি সবচেয়ে ভাল হওয়ার সবচেয়ে গুরুত্বপূর্ণ কারণটি হ'ল এর মধ্যে কম সংযুক্তি রয়েছে যা এটি আরও কার্যকর করে, তর্ক করার পক্ষে সহজ, পরীক্ষা করা সহজ এবং অনুলিপি + আটকানো ক্লোনগুলিতে পরিণত হওয়ার সম্ভাবনা কম।

আপনি কি আমাকে একটা প্রদান তাহলে CreateFlurp(BadaBoom), আমি ব্যবহার করতে পারেন সংগ্রহে ধারক কোন প্রকার সঙ্গে: সরল Flurp[], List<Flurp>, LinkedList<Flurp>, Dictionary<Key, Flurp>, ইত্যাদি। তবে একটি দিয়ে CreateFlurpInList(BadaBoom, List<Flurp>), আমি আগামীকাল আপনার কাছে ফিরে আসার জন্য অনুরোধ করছি CreateFlurpInBindingList(BadaBoom, BindingList<Flurp>)যাতে আমার ভিউ মডেলটি বিজ্ঞপ্তিটি পেতে পারে যে তালিকাটি পরিবর্তিত হয়েছে। ইশ!

অতিরিক্ত বেনিফিট হিসাবে, সহজ স্বাক্ষরটি বিদ্যমান এপিআইগুলির সাথে ফিট হওয়ার সম্ভাবনা বেশি। আপনি বলছেন আপনার একটি পুনরাবৃত্তি সমস্যা আছে

বরং আমি নিজেকে অন্য তালিকা থেকে একটি তালিকা তৈরি করতে দেখি

এটি উপলব্ধ সরঞ্জামগুলি ব্যবহার করার বিষয় মাত্র। সবচেয়ে স্বল্পতম, সবচেয়ে দক্ষ এবং সর্বোত্তম সংস্করণটি হ'ল:

var Flurps = badaBooms.ConvertAll(CreateFlurp);

আপনার লেখার জন্য এবং পরীক্ষা করার জন্য কেবল এই কম কোডই নয়, এটি আরও দ্রুত, কারণ List<T>.ConvertAll()ফলাফলটি ইনপুট হিসাবে একই সংখ্যক আইটেম পাবে এবং ফলাফলের তালিকাটি সঠিক আকারে প্রিলোকল্ট করতে পারে তা জানতে যথেষ্ট স্মার্ট। আপনার কোড (উভয় সংস্করণ) তালিকা বর্ধনের জন্য প্রয়োজন।


ব্যবহার করবেন না List.ConvertAll। সি # তে বিভিন্ন অবজেক্টের কাছে অগণিত অবজেক্টের মানচিত্রের অদ্ভুত উপায়টিকে বলা হয় SelectConvertAllএখানে এমনকি একমাত্র কারণ উপলভ্য কারণ ওপি ভুল Listপদ্ধতিতে পদ্ধতিতে একটি জিজ্ঞাসা করছে - এটি হওয়া উচিত IEnumerable
কার্ল লেথ

6

সামগ্রিক লক্ষ্যটি মাথায় রাখুন: কোডটি পড়া এবং বজায় রাখা সহজ করে তুলুন।

প্রায়শই একাধিক লাইনকে একক, অর্থপূর্ণ ফাংশনে ভাগ করা সম্ভব হবে। এই ক্ষেত্রে এটি করুন। মাঝে মাঝে আপনাকে আপনার সাধারণ পদ্ধতির পুনর্বিবেচনা করতে হবে।

উদাহরণস্বরূপ, আপনার ক্ষেত্রে পুরো প্রয়োগটি var সহ প্রতিস্থাপন করুন

flups = badaBooms.Select(bb => new Flurp(bb));

একটি সম্ভাবনা হতে পারে। অথবা আপনি কিছু করতে পারে

flups.Add(new Flurp(badaBoom))

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

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

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