আমি কীভাবে একটি বুলিয়ান ক্লিয়ারারের সাথে কল করতে পারি? বুলিয়ান ট্র্যাপ


76

@ বেনজমিন-গ্রেনবাউমের মন্তব্যে যেমন উল্লেখ করা হয়েছে, এগুলিকে বুলিয়ান ট্র্যাপ বলা হয়:

বলুন আমার এর মত একটি ফাংশন আছে

UpdateRow(var item, bool externalCall);

এবং আমার নিয়ামক হিসাবে, এর মান externalCallসর্বদা সত্য হবে। এই ফাংশনটি কল করার সর্বোত্তম উপায় কী? আমি সাধারণত লিখি

UpdateRow(item, true);

তবে আমি আমার আত্মাকে জিজ্ঞাসা করি, আমি কি একটি বুলিয়ান ঘোষণা করব, কেবল সেই 'সত্য' মানটির অর্থ কী? আপনি জানতে পারেন যে ফাংশনটির ঘোষণাপত্রটি দেখে, তবে এটি স্পষ্টতই দ্রুত এবং স্পষ্ট হয় যদি আপনি ঠিক এর মতো কিছু দেখেন

bool externalCall = true;
UpdateRow(item, externalCall);

পিডি: নিশ্চিত না যে এই প্রশ্নটি এখানে সত্যই ফিট করে কিনা, যদি তা না হয় তবে আমি এই বিষয়ে আরও তথ্য কোথায় পাব?

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


10
এই প্যাটার্নটিকে বুলিয়ান
ট্র্যাপও

11
আপনি যদি বীজগণিত সংক্রান্ত ডেটা ধরণের সমর্থনের জন্য কোনও ভাষা ব্যবহার করেন তবে আমি খুব বেশি বুলিয়ানের পরিবর্তে একটি নতুন অ্যাডেটের সুপারিশ করব। data CallType = ExternalCall | InternalCallউদাহরণস্বরূপ haskell এ।
ফিলিপ হাগলুন্ড

6
আমার ধারণা এনামস ঠিক একই উদ্দেশ্য পূরণ করবে; বুলিয়ানদের নাম এবং কয়েকটি ধরণের সুরক্ষা পাওয়া।
ফিলিপ হাগলুন্ড

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

বুলিয়ান ঘোষক পরিষ্কার নয়, পরিষ্কার যে এটি কেবল একটি পদক্ষেপের উপরে ঝাঁপিয়ে পড়েছে, প্রশ্নে থাকা পদ্ধতির ডকুমেন্টেশনটি দেখে। আপনি যদি স্বাক্ষরটি জানেন তবে একটি নতুন ধ্রুবক যুক্ত করা কম পরিষ্কার।
insidedin

উত্তর:


154

সর্বদা একটি নিখুঁত সমাধান হয় না, তবে আপনার কাছে বেছে নিতে অনেক বিকল্প রয়েছে:

  • আপনার ভাষায় উপলভ্য থাকলে নামযুক্ত যুক্তি ব্যবহার করুন । এটি খুব ভালভাবে কাজ করে এবং এর কোনও বিশেষ ত্রুটি নেই। কিছু ভাষায়, কোনও যুক্তি নামযুক্ত আর্গুমেন্ট হিসাবে পাস করা যেতে পারে, যেমন updateRow(item, externalCall: true)( সি # ) বা update_row(item, external_call=True)(পাইথন)।

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

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

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

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

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

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


7
আমি কেবল শিখেছি যে "নামী যুক্তি" বিদ্যমান রয়েছে। আমি মনে করি এটি এখন পর্যন্ত সেরা পরামর্শ। আপনি যদি সেই বিকল্পটিতে কিছুটা ব্যাখ্যা করতে পারেন (যাতে অন্য ব্যক্তির পক্ষে এটি সম্পর্কে খুব বেশি গুগলের প্রয়োজন না হয়) আমি এই উত্তরটি গ্রহণ করব। পারফরম্যান্সে কোনও ইঙ্গিত যদি আপনি পারেন ... ধন্যবাদ
মারিও গার্সিয়া

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

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

4
এই ভূমিকায় স্ট্রিংগুলি ব্যবহারের আর একটি অসুবিধা হ'ল আপনি এনামগুলি থেকে আলাদা করে সংকলন সময়ে তাদের বৈধতা পরীক্ষা করতে পারবেন না।
রুসলান

32
এনাম বিজয়ী। প্যারামিটারের কেবল দুটি সম্ভাব্য অবস্থার মধ্যে একটি থাকতে পারে তার অর্থ এই নয় যে এটি স্বয়ংক্রিয়ভাবে একটি বুলিয়ান হওয়া উচিত।
পিট

39

সঠিক সমাধানটি যা আপনি পরামর্শ দেন তা করা, তবে এটি একটি মিনি-ফ্যাকাসে প্যাকেজ করুন:

void updateRowExternally() {
  bool externalCall = true;
  UpdateRow(item, externalCall);
}

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


8
আমি যখন আমার নিয়ামকটিতে একবার কেবল সেই ফানসিওন বলি তখন কি এই এনক্যাপসুলেশনটি সত্যই মূল্যবান?
মারিও গার্সিয়া

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

8
এছাড়াও যে কোনও উপযুক্ত অপ্টিমাইজার আপনার পক্ষে এটি ইনলাইন করতে সক্ষম হওয়া উচিত যাতে শেষ পর্যন্ত আপনার কোনও ক্ষতি হারা উচিত নয়।

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

6
আমি মনে করি UpdateRow(item, true /*external call*/);যে ভাষাগুলি সেই মন্তব্যে সিনট্যাক্সের অনুমতি দেয়, সেগুলি পরিষ্কার হবে। কোনও মন্তব্য লেখা এড়ানোর জন্য আপনার কোডটি অতিরিক্ত ফাংশন দিয়ে স্ফীত করা কোনও সাধারণ ক্ষেত্রে এটি উপযুক্ত বলে মনে হচ্ছে না। সম্ভবত যদি এই ফাংশনটিতে প্রচুর অন্যান্য আরগগুলি থাকে এবং / অথবা কিছু বিশৃঙ্খল + আশেপাশের কোডগুলি থাকে তবে এটি আরও আবেদন করতে শুরু করবে। তবে আমি মনে করি আপনি যদি ডিবাগ করেন তবে আপনি কী করছেন তা দেখার জন্য মোড়ক ফাংশনটি চেক করে শেষ করতে যাচ্ছেন এবং কোনও লাইব্রেরির এপিআইয়ের চারপাশে কোন ফাংশনগুলি পাতলা র‌্যাপারগুলি এবং কোনটি যুক্তিযুক্ত তা মনে রাখতে হবে।
পিটার কর্ডেস

25

বলুন আমার আপডেটডোর মতো একটি ফাংশন আছে (ভের আইটেম, বুল আউটটারকল);

আপনি কেন এই ধরনের একটি ফাংশন আছে?

কোন পরিস্থিতিতে আপনি এটিকে বহিরাগত কলকে বিভিন্ন মানকে সেট করে যুক্তি বলবেন?

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

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


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

18

যদিও আমি একমত যে পাঠ্যযোগ্যতা এবং মান-সুরক্ষা উভয়ই প্রয়োগ করতে কোনও ভাষা বৈশিষ্ট্য ব্যবহার করা আদর্শ , আপনি একটি ব্যবহারিক পদ্ধতির জন্যও বেছে নিতে পারেন : কল-টাইম মন্তব্য। ভালো লেগেছে:

UpdateRow(item, true /* row is an external call */);

বা:

UpdateRow(item, true); // true means call is external

বা (যথাযথভাবে, ফ্রেক্সের পরামর্শ অনুসারে):

UpdateRow(item, /* externalCall */true);

1
ডাউনভোট করার কোনও কারণ নেই। এটি একটি সম্পূর্ণ বৈধ পরামর্শ।
সানকাট 2000

<3 @ সানক্যাট 2000 প্রশংসা করুন!
বিশপ

11
একটি (সম্ভবত পছন্দসই) বৈকল্পিক কেবল প্লেইন আর্গুমেন্টের নামটি এখানে রাখছে, যেমন UpdateRow(item, /* externalCall */ true )। পূর্ণ বাক্য মন্তব্য পার্স করা বেশ শক্ত, এটি আসলে বেশিরভাগই শব্দ (বিশেষত দ্বিতীয় রূপ, যা খুব আস্তে যুক্তির সাথে মিলিত হয়)।
ফ্রেक्स

1
এটি এখন পর্যন্ত সবচেয়ে উপযুক্ত উত্তর। এটি ঠিক মতামতগুলির উদ্দেশ্যে কী।
সেন্টিনেল

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

11
  1. আপনি আপনার bools 'নাম' করতে পারেন। নীচে একটি ওও ভাষার উদাহরণ রয়েছে (যেখানে এটি শ্রেণীর সরবরাহ করাতে প্রকাশ করা যেতে পারে UpdateRow()) তবে ধারণাটি নিজেই কোনও ভাষায় প্রয়োগ করা যেতে পারে:

    class Table
    {
    public:
        static const bool WithExternalCall = true;
        static const bool WithoutExternalCall = false;
    

    এবং কল সাইটে:

    UpdateRow(item, Table::WithExternalCall);
    
  2. আমি বিশ্বাস করি আইটেম # 1 আরও ভাল তবে ফাংশনটি ব্যবহার করার সময় এটি ব্যবহারকারীকে নতুন ভেরিয়েবলগুলি ব্যবহার করতে বাধ্য করে না। যদি আপনার জন্য টাইপ সুরক্ষা গুরুত্বপূর্ণ, আপনি একটি enumটাইপ তৈরি করতে পারেন এবং UpdateRow()এটির পরিবর্তে এটি গ্রহণ করতে পারেন bool:

    UpdateRow(var item, ExternalCallAvailability ec);

  3. আপনি কোনওভাবে ফাংশনটির নামটি পরিবর্তন করতে পারেন যে এটি boolপ্যারামিটারটির অর্থ আরও ভাল প্রতিফলিত করে । খুব নিশ্চিত না তবে হতে পারে:

    UpdateRowWithExternalCall(var item, bool externalCall)


8
এখনই # 3 টি পছন্দ করবেন না যদি আপনি ফাংশনটি দিয়ে কল করেন তবে externalCall=falseএর নামটি একেবারেই কোনও অর্থ দেয় না। আপনার উত্তর বাকি ভাল।
অরবিটে মেঘলা হালকা রেস

একমত। আমি খুব নিশ্চিত ছিলাম না তবে এটি অন্য কোনও কাজের জন্য একটি কার্যকর বিকল্প হতে পারে। আমি
সিমুর্গ

পছন্দ করুন এটি যেতে নিরাপদ UpdateRowWithUsuallyExternalButPossiblyInternalCall
এরিক ডুমিনিল

@ এরিকডুমিনিল: স্পট 😂
ঘোড়দৌড়

10

আমি এখানে এখনও পড়িনি অন্য অপশনটি হ'ল: একটি আধুনিক আইডিই ব্যবহার করুন।

উদাহরণস্বরূপ IntelliJ আইডিয়া পদ্ধতিতে ভেরিয়েবল যদি আপনি হিসাবে একটি আক্ষরিক যেমন পার করছি আহ্বান করছি পরিবর্তনশীল নাম ছাপে trueবা nullবা username + “@company.com। এটি একটি ছোট ফন্টে করা হয়েছে যাতে এটি আপনার স্ক্রিনে খুব বেশি জায়গা নেয় না এবং প্রকৃত কোড থেকে খুব আলাদা দেখায়।

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

আমার পরীক্ষার সেটআপের অংশটির পরিবর্তিত উদাহরণ: এখানে চিত্র বর্ণনা লিখুন


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

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

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

1
@ ড্যানিয়েলপ্রাইডেন আমি অত্যন্ত আড়ম্বরপূর্ণ কোড লেখার পক্ষে পরামর্শ দিচ্ছি না। এটি কোনও কালো ও সাদা পরিস্থিতি নয়। এমন কেস হতে পারে যেখানে অতীতে নির্দিষ্ট পরিস্থিতিতে আপনি বুলিয়ান দিয়ে একটি ফাংশন লেখার পক্ষে 40% এবং 60% না হয়ে থাকতে পারেন এবং আপনি এটি না করে শেষ করেছেন। ভাল আইডিই সমর্থন সহ এখন ব্যালেন্স 55% এর মতো লিখতে পারে এবং 45% নয়। এবং হ্যাঁ আপনাকে এখনও কখনও কখনও এটি আইডিই এর বাইরে পড়তে হবে যাতে এটি নিখুঁত হয় না। তবে এটি এখনও বিকল্পের বিরুদ্ধে বৈধ বাণিজ্য-অফ, যেমন অন্য কোনও পদ্ধতি যুক্ত করা বা কোড অন্যথায় পরিস্কার করার জন্য গণনা করা।
সেবাস্তিয়ান ভ্যান ডেন ব্রুক

6

2 দিন এবং কোনটি বহুবিজ্ঞানের কথা উল্লেখ করেছে?

target.UpdateRow(item);

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

এটি করুন এবং এটি নির্মাণ সমস্যার অংশ হয়ে যায়। এটি অনেক উপায়ে সমাধান করা যেতে পারে। এখানে একটি:

Target xyzTargetFactory(TargetBuilder targetBuilder) {
    return targetBuilder
        .connectionString("some connection string")
        .table("table_name")
        .external()
        .build()
    ; 
}

আপনি যদি সেটির দিকে তাকিয়ে ভাবছেন এবং "তবে আমার ভাষাতে যুক্তির নাম দেওয়া হয়েছে, আমার এটির দরকার নেই"। দুর্দান্ত, দুর্দান্ত, তাদের ব্যবহার করুন। কেবল কলিং ক্লায়েন্টের বাইরে এই বাজে কথা রাখুন যা এটি কী বলছে তা এমনকি জানা উচিত নয়।

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


2

আপনি যদি updateRowফাংশনটি সংশোধন করতে পারেন তবে সম্ভবত আপনি এটি দুটি ফাংশনে রিফ্যাক্টর করতে পারেন। ফাংশনটি একটি বুলিয়ান প্যারামিটার গ্রহণ করে, আমি সন্দেহ করি এটি এর মতো দেখাচ্ছে:

function updateRow(var item, bool externalCall) {
  Database.update(item);

  if (externalCall) {
    Service.call();
  }
}

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

function updateRowAndService(var item) {
  updateRow(item);
  Service.call();
}

function updateRow(var item) {
  Database.update(item);
}

এখন, আপনি যে কোনও জায়গায় এই ফাংশনগুলিকে কল করুন না কেন, আপনি বাহ্যিক পরিষেবাটি কল করা হচ্ছে কিনা তা এক নজরে বলতে পারেন।

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


0

আপডেটআর যদি নিয়ন্ত্রিত কোডবেজে থাকে তবে আমি কৌশলের ধরণটি বিবেচনা করব:

public delegate void Request(string query);    
public void UpdateRow(Item item, Request request);

অনুরোধ যেখানে কোনও ধরণের ডিএও (তুচ্ছ ক্ষেত্রে একটি কলব্যাক) উপস্থাপন করে।

সত্য ঘটনা:

UpdateRow(item, query =>  queryDatabase(query) ); // perform remote call

মিথ্যা মামলা:

UpdateRow(item, query => readLocalCache(query) ); // skip remote call

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

UpdateRow(item, query => {
  var data = readLocalCache(query);
  if (data == null) {
    data = queryDatabase(query);
  }
  return data;
} );

সাধারণভাবে, এই জাতীয় নিয়ন্ত্রণের বিপরীততা আপনার ডেটা স্টোরেজ এবং মডেলের মধ্যে নিম্ন মিলন নিশ্চিত করে।

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