কোন মুহূর্তে ব্রেভিটি এখন পুণ্য নয়?


102

সাম্প্রতিক একটি বাগ ফিক্সের জন্য আমাকে অন্যান্য দলের সদস্যদের দ্বারা লিখিত কোডটি অতিক্রম করতে হবে, যেখানে আমি এটি পেয়েছি (এটি সি #):

return (decimal)CostIn > 0 && CostOut > 0 ? (((decimal)CostOut - (decimal)CostIn) / (decimal)CostOut) * 100 : 0;

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

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

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

কাস্টগুলির কারণ হ'ল সত্তা ফ্রেমওয়ার্ক। ডিবিগুলিকে এগুলি nlalable প্রকার হিসাবে সংরক্ষণ করতে হবে। ডেসিমাল? সি # তে দশমিকের সমান নয় এবং কাস্ট করা প্রয়োজন।


153
যখন ব্রাভিটি পাঠযোগ্যতা ট্রাম্প করে।
রবার্ট হার্ভে

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

29
বিশেষত, এটি উদ্ভট বলে মনে হয় যে এটি শূন্যের সাথে তুলনা করার জন্য কোস্টইনকে দশমিককে কাস্ট করা প্রয়োজন, তবে কস্টআউট নয়; এটা কেন? পৃথিবীতে কোস্টইনের প্রকারটি কী এটি একে দশমিকের সাথে ফেলে শূন্যের সাথে তুলনা করা যেতে পারে? এবং কেন কস্টআউট কোস্টইনের মতো একই ধরণের নয়?
এরিক লিপার্ট

12
তাছাড়া এখানে যুক্তি আসলে ভুল হতে পারে actually ধরুন CostOutএর সমান Double.Epsilon, এবং তাই শূন্যের চেয়ে বড়। তবে (decimal)CostOutসেই ক্ষেত্রে শূন্য, এবং আমাদের শূন্য ত্রুটির দ্বারা বিভাজন রয়েছে। প্রথম ধাপটি কোডটি সঠিকভাবে পাওয়া উচিত যা আমি মনে করি এটি এটি নয়। এটি সঠিক হয়ে নিন, পরীক্ষার কেসগুলি তৈরি করুন এবং তারপরে এটি মার্জিত করুন । মার্জিত কোড এবং সংক্ষিপ্ত কোডের মধ্যে প্রচুর মিল রয়েছে তবে কখনও কখনও সংক্ষিপ্ততা কমনীয়তার আত্মা হয় না।
এরিক লিপার্ট

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

উত্তর:


163

বিদ্যমান গবেষণা সম্পর্কে আপনার প্রশ্নের উত্তর দিতে

কিন্তু কোড ব্রেভিটির জন্য প্রচেষ্টা করা কার্যকর হওয়া বন্ধ করে বোঝার পথে বাধা হয়ে দাঁড়িয়েছে এমন বিষয়টিকে স্বীকৃতি দেওয়ার জন্য কি কিছু লেখা বা গবেষণা করা হয়েছে?

হ্যাঁ, এই এলাকায় কাজ হয়েছে।

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

সাইক্লোমেটিক জটিলতা Code কোডের সোর্স লাইনগুলি ( এসএলওসি )

আপনার কোড উদাহরণে, এই অনুপাতটি খুব বেশি, কারণ সমস্ত কিছু এক লাইনে সংকুচিত হয়েছে।

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

লিংক

আপনি যদি আগ্রহী হন তবে এখানে কয়েকটি উল্লেখ রয়েছে:

ম্যাককেবে, টি। এবং এ। ওয়াটসন (1994), সফটওয়্যার কমপ্লেক্সিটি (ক্রসটালক: জার্নাল অফ ডিফেন্স সফটওয়্যার ইঞ্জিনিয়ারিং)।

ওয়াটসন, এএইচ, এবং ম্যাককেবে, টিজে (1996)। স্ট্রাকচার্ড টেস্টিং: সাইক্লোমেটিক কমপ্লেক্সিটি মেট্রিক (এনআইএসটি বিশেষ প্রকাশনা 500-235) ব্যবহার করে একটি পরীক্ষার পদ্ধতি। ম্যাককেব সফ্টওয়্যার ওয়েব সাইট থেকে 14 ই মে, ২০১১ পুনরুদ্ধার করা হয়েছে: http://www.mccabe.com/pdf/mccabe-nist235r.pdf

রোজনবার্গ, এল।, হ্যামার, টি। শ, জে (1998)। সফ্টওয়্যার মেট্রিক্স এবং নির্ভরযোগ্যতা (সফটওয়্যার রিলিবিবিলিটি ইঞ্জিনিয়ারিংয়ের আইইইই ইন্টারন্যাশনাল সিম্পোজিয়ামের কার্যক্রিয়া)। পেন স্টেট বিশ্ববিদ্যালয় ওয়েব সাইট থেকে ১৪ ই মে, ২০১১, পুনরুদ্ধার হয়েছে: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.4041&rep=rep1&type=pdf

আমার মতামত এবং সমাধান

ব্যক্তিগতভাবে, আমি কখনও ব্রেভিটিকে মূল্যবান করি না , কেবল পঠনযোগ্যতা। কখনও কখনও সংকোচনের পাঠযোগ্যতা সাহায্য করে, কখনও কখনও এটি না। এর চেয়ে গুরুত্বপূর্ণটি হল আপনি লিখিত -কেবল কোড (ডব্লুওসি) এর পরিবর্তে সত্যই প্রকাশ্য কোড (আরওসি) লিখছেন ।

কেবল মজাদার জন্য, আমি এখানে এটি কীভাবে লিখব এবং আমার দলের সদস্যদের এটি লিখতে বলুন:

if ((costIn <= 0) || (costOut <= 0)) return 0;
decimal changeAmount = costOut - costIn;
decimal changePercent = changeAmount / costOut * 100;
return changePercent;

উল্লেখ্য, কার্যকরী ভেরিয়েবলগুলির প্রবর্তনের পূর্ণসংখ্যার গাণিতিকের পরিবর্তে স্থির-পয়েন্ট পাটিগণিতকে ট্রিগার করার সুখী পার্শ্ব প্রতিক্রিয়া রয়েছে, সুতরাং সেই সমস্ত ক্যাসেটের প্রয়োজনীয়তা decimalঅপসারণ করা উচিত।


4
আমি সত্যিই শূন্যের চেয়ে কম ক্ষেত্রে গার্ড ক্লজটি পছন্দ করি। কোনও মন্তব্য করার উপযুক্ত হতে পারে: ব্যয়টি শূন্যের চেয়ে কম কীভাবে হতে পারে, এটি বিশেষ কী?
user949300

22
+1 টি। আমি সম্ভবত এর মতো কিছু যুক্ত করবif ((costIn < 0) || (costOut < 0)) throw new Exception("costs must not be negative");
ডক ব্রাউন

13
@ ডকব্রাউন: এটি একটি ভাল পরামর্শ, তবে আমি ব্যতিক্রমী কোড পাথটি পরীক্ষা করে ব্যবহার করতে পারি কিনা তা বিবেচনা করব। যদি হ্যাঁ, তবে একটি পরীক্ষার কেস লিখুন যা সেই কোড পথে অনুশীলন করে। যদি না হয়, তবে পুরো জিনিসটিকে একটি সঞ্চারে পরিবর্তন করুন।
এরিক লিপার্ট

12
যদিও এটি সমস্ত ভাল পয়েন্ট, আমি বিশ্বাস করি এই প্রশ্নের ক্ষেত্রটি কোড শৈলী, যুক্তি নয়। আমার কোড স্নিপ একটি ব্ল্যাক বক্সের দৃষ্টিকোণ থেকে কার্যকরী সমতার জন্য একটি প্রচেষ্টা is ব্যতিক্রম নিক্ষেপ করা 0 ফেরত দেওয়ার মতো নয়, সুতরাং সমাধানটি কার্যত সমতুল্য হবে না।
জন উ

30
"ব্যক্তিগতভাবে আমি ব্রেভিটি কখনই মূল্যবান করে না , কেবল পঠনযোগ্যতার জন্য Sometimes দুর্দান্ত পয়েন্ট। কেবল এটির জন্য +1। আমি আপনার কোড সমাধানটিও পছন্দ করি।
ওয়াইল্ডকার্ড

49

ব্রেভিটি ভাল হয় যখন এটি জিনিসগুলির চারপাশে বিশৃঙ্খলা হ্রাস করে, কিন্তু যখন এটি নিঃসরণ হয়ে যায় , খুব সহজেই অনুসরণ করতে খুব বেশি প্রাসঙ্গিক ডেটা খুব ঘন করে প্যাক করে, তখন প্রাসঙ্গিক ডেটা নিজেই বিশৃঙ্খল হয়ে যায় এবং আপনার সমস্যা আছে have

এই বিশেষ ক্ষেত্রে, কাস্টগুলি decimalবারবার বারবার করা হচ্ছে; এটিকে আবার নতুন করে লেখার মতো সামগ্রিকভাবে আরও ভাল হবে:

var decIn = (decimal)CostIn;
var decOut = (decimal)CostOut;
return decIn > 0 && CostOut > 0 ? (decOut - decIn ) / decOut * 100 : 0;
//                  ^ as in the question

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


1
আমি সম্ভবত আরও দূরে গিয়ে ((decOut - decIn ) / decOut) * 100অন্য একটি চলকটিতে রিফ্যাক্টর করতাম ।
হতাশ

9
অ্যাসেমব্লার অনেক স্পষ্ট ছিল: প্রতি লাইনে কেবল একটি অপারেশন। ডোহ!

2
@ ফ্রাস্ট্রেটেড উইথফোর্ডস ডিজাইনার আমি আরও একধাপ এগিয়ে গিয়ে শর্তসাপেক্ষ চেক বন্ধনীগুলিতে গুটিয়ে রাখতে চাই।
ক্রিস সাইরাফাইস

1
@ ফ্রাস্ট্রেটড উইথফরমস ডিজাইনার: শর্তসাপেক্ষে শর্তসাপেক্ষে শৃঙ্খলা বাহিরে শূন্যের চেক ( CostOut > 0) কে বাইপাস করতে পারার আগে এটি এক্সট্রাক্ট করা , সুতরাং আপনাকে শর্তসাপেক্ষে একটি ifস্টেস্টমেন্টে প্রসারিত করতে হবে । এটির সাথে কোনও সমস্যা নেই তা নয়, তবে এটি কেবল একটি স্থানীয় পরিচিতির চেয়ে আরও ভার্বোসটি যুক্ত করে।
wchargin

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

7

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

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


(দশমিক) কাস্টগুলি সম্ভবত কিছু ব্যবসায়ের নিয়মের প্রয়োজনীয়তা মেটানোর জন্য। হিসাবরক্ষকদের সাথে ডিল করার সময় আপনাকে মাঝে মাঝে বোকা হুপসের মধ্য দিয়ে ঝাঁপিয়ে পড়তে হয়। আমি ভেবেছিলাম সিএফওর যখন হার্ট অ্যাটাক হয় তখন তিনি অনুরোধকৃত কার্যকারিতাটি প্রদত্ত "অন করণীয় - ট্যাক্স রাউন্ডঅফ সংশোধন - $ 0.01" লাইনটি পেয়েছিলেন। (সরবরাহিত: করের পরে মূল্য। আমাকে করের আগের মূল্যটি নির্ধারণ করতে হবে there এর মধ্যে কোনও
প্রতিক্রিয়া থাকবে

@ লরেনপেকটেল: প্রদত্ত যে কাস্টিংটি যথাযথভাবে নির্ধারণ করা হবে তা প্রশ্নের মানটির পরিমাণের Decimalউপর নির্ভর করে, ব্যবসায়ের নিয়মগুলি কল্পনা করা আমার পক্ষে কঠিন বলে মনে হচ্ছে যে ক্যাসেটগুলি বাস্তবে যেভাবে আচরণ করবে তা কল্পনা করতে পারে।
সুপারক্যাট

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

1
@ লরেনপেকটেল: আমার শেষ পয়েন্টটি স্পষ্ট করতে: একটি নির্দিষ্ট পয়েন্ট টাইপ গ্যারান্টি দিতে পারে যে এক্স + ইয়ে আপনার ওভারফ্লো হবে বা y ফলন করবে। Decimalটাইপ না। ১.০ ডি / 3.0.০ মানের দশমিকের ডানদিকে আরও বেশি অঙ্ক থাকবে যখন বড় সংখ্যা ব্যবহার করার সময় বজায় রাখা যায়। সুতরাং একই বৃহত সংখ্যাকে যোগ করা এবং তার পরে বিয়োগ করা নির্ভুল ক্ষতি হতে পারে। স্থির-পয়েন্টের ধরণের অংশগুলি ভগ্নাংশের গুণ বা বিভাগের সাথে নির্ভুলতা হারাতে পারে তবে যোগ, বিয়োগ, গুণ বা ভাগের সাথে বিভাজন (উদাহরণস্বরূপ 1.00 / 7 হল 0.14 বাকী 0.2; 1.00 ডিভ 0.15 6 টি বাকী 0.10)।
সুপারক্যাট

1
@ হাল্ক: হ্যাঁ, অবশ্যই X + yy উত্পাদনকারী x, x + yx উত্পাদনকারী y, বা x + yxy ব্যবহার করবেন কিনা তা নিয়ে আমি বিতর্ক করছিলাম এবং প্রথম দুটিতে মিশ-মশিং শেষ করব। কি গুরুত্বপূর্ণ নির্দিষ্ট বিন্দু ধরনের গ্যারান্টি পারেন যে অপারেশনের অনেক ক্রম ধরা পড়েনি রাউন্ডইং ত্রুটি কখনোই হতে হবে কোনো মাত্রা। যদি কোডগুলি বিভিন্ন উপায়ে একত্রে যোগ করে তা প্রমাণ করে যে মোটের মিল হয় (উদাহরণস্বরূপ কলাম সাবটোটেলের যোগফলের সাথে সারি সাবটোটেলের যোগফলের তুলনা করা), ফলাফলগুলি ঠিক সমান বেরিয়ে আসে তবে সেগুলি "কাছাকাছি" আসার চেয়ে অনেক ভাল better
সুপারক্যাট

5

আমি সেই কোডটি দেখি এবং জিজ্ঞাসা করি "কীভাবে ব্যয় 0 (বা কম) হতে পারে?" " এটি কোন বিশেষ ক্ষেত্রে নির্দেশ করে? কোড হওয়া উচিত

bool BothCostsAreValidProducts = (CostIn > 0) && (CostOut > 0);
if (!BothCostsAreValidProducts)
  return NO_PROFIT;
else {
   // that calculation here...
}

আমি এখানে নাম হিসাবে অনুমান করছি: পরিবর্তন BothCostsAreValidProductsএবং NO_PROFITযথাযথ হিসাবে।


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

আপনার ডান ট্র্যাক।
danny117

এটি বোকামি. if (CostIn <= 0 || CostOut <= 0)পুরোপুরি ঠিক আছে।
মাইলস রাউট

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

5

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

  1. ব্যবসায়ের প্রয়োজনীয়তা কমপক্ষে কাজের সাথে পূরণ করুন

  2. বাগগুলি এড়িয়ে চলুন

  3. আমাদের ভবিষ্যতে পরিবর্তনগুলি করার অনুমতি দিন যা 1 এবং 2 টির পরিপূর্ণতা অব্যাহত রাখে

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

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

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

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

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

সুতরাং সমস্যাটি ব্রিভিটি বা এটির অভাব নয়, সমস্যাটি বারবার যুক্তিযুক্ত এবং উদ্বেগের সংঘাত যা কঠোরভাবে বজায় রাখা কোডের দিকে নিয়ে যায়।

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


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

3

ব্রেভিটি মোটেই পুণ্য নয়। পঠনযোগ্যতা পুণ্য।

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

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


2

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

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

decimal dIn = (decimal)CostIn;
decimal dOut = (decimal)CostOut;
return dIn > 0 && CostOut > 0 ? ((dOut - dIn) / dOut) * 100 : 0;

(সম্পাদনা করুন: এটি অন্যান্য উত্তরের মতো একই কোড, সুতরাং আপনি সেখানে যান))

আমি টার্নারি অপারেটরের একজন অনুরাগী ? :, তাই আমি এটিকে রেখে দেব।


5
টেরিনারিগুলি পড়া শক্ত, বিশেষত যদি কোনও একক মানের বা ফেরতের মানগুলির মধ্যে পরিবর্তনশীলের বাইরে কোনও অভিব্যক্তি থাকে।
অলমো

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

1
সত্যিই নিশ্চিত নয়। আমি তোমাকে উড়িয়ে দেইনি আমি টেরেনারি পছন্দ করি না কারণ এর দুপাশে কী আছে তা পরিষ্কার নয় :if-elseইংরেজির মতো পড়ে: এর অর্থ কী তা মিস করতে পারে না।
Almo

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

1
টার্নারি অপারেটরের মৃত্যু !! (এছাড়াও, ট্যাবগুলিতে মৃত্যু, শূন্যস্থান এবং কোনও ব্র্যাককেটিং & ইন্ডেন্টেশন মডেল অলম্যান বাদে (প্রকৃতপক্ষে, ডোনাল্ড (টিএম) টুইট করেছেন যে তিনি এই প্রথম তিনটি আইন যা তিনি 20 তারিখে
প্রেরণ করেছেন

2

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

return ((decimal)CostIn > 0 && CostOut > 0) ?
       100 * ( (decimal)CostOut - (decimal)CostIn ) / (decimal)CostOut:
       0;

আমি বেশিরভাগ ক্ষেত্রে সাইক্লোমেটিক জটিলতার যুক্তির সাথে দৃ strongly়ভাবে সম্মত হই, তবে আপনার কার্যকারিতাটি একটি ভাল পরীক্ষার ক্ষেত্রে আরও ভালভাবে মোকাবেলার জন্য যথেষ্ট ছোট এবং সহজ বলে মনে হচ্ছে। কৌতূহলের বাইরে দশমিকায় পড়তে হবে কেন?


4
কাস্টগুলির কারণ হ'ল সত্তা ফ্রেমওয়ার্ক। ডিবি এগুলি নালার মতো সংরক্ষণ করতে হবে as দ্বিগুন? সি # ডাবল এর সমতুল্য নয় এবং এটি castালাই করা দরকার।
ম্যাট থ্রোয়ার

2
@ ম্যাটথ্রওয়ার আপনার মানে decimal, তাই না? double! = decimal, একটি বড় পার্থক্য আছে।
গোলাপিফ্লোয়েডএক্স 33

1
@ গোলাপফ্লোয়েডএক্স 33 হ্যাঁ! কেবলমাত্র অর্ধেক মস্তিষ্কের সাথে যুক্ত ফোনে টাইপ করা :)
ম্যাট থ্রোয়ার

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

3
আমি এই পাঠ্য মোটেও খুঁজে পাচ্ছি না।
Almo

1

আমার কাছে, দেখে মনে হচ্ছে এখানে পাঠযোগ্যতার একটি বড় সমস্যা বিন্যাসের সম্পূর্ণ অভাবের মধ্যে রয়েছে।

আমি এটি লিখতে হবে:

return (decimal)CostIn > 0 && CostOut > 0 
            ? (((decimal)CostOut - (decimal)CostIn) / (decimal)CostOut) * 100 
            : 0;

প্রকারভেদ CostInএবং CostOutভাসমান-বিন্দুর ধরণ বা অবিচ্ছেদ্য প্রকারের উপর নির্ভর করে কিছু কিছু কাস্ট অপ্রয়োজনীয়ও হতে পারে। বিপরীতে floatএবং double, অবিচ্ছেদ্য মানগুলি স্পষ্টভাবে প্রচারিত হয় decimal


আমি কোন ব্যাখ্যা ছাড়াই এটিকে হ্রাস করা হয়েছে বলে দুঃখিত, তবে এটি ব্যাকপ্যাকডের উত্তর বিয়োগের সাথে তাঁর কিছু মন্তব্যকে অভিন্ন বলে মনে হচ্ছে , সুতরাং আমি মনে করি এটি ন্যায়সঙ্গত ছিল।
পিজেট্রাইল

@ পিজেট্রেইল আমি অবশ্যই এটি মিস করেছি, এটি প্রায় অভিন্ন। যাইহোক, আমি নতুন লাইনে অপারেটরদের থাকা দৃ strongly়ভাবে পছন্দ করি, এজন্য আমি আমার সংস্করণটি দাঁড়াতে দেব।
ফেলিক্স ডমব্যাক

অপারেটরদের সম্পর্কে আমি একমত, যেমন আমি অন্য উত্তরের একটি মন্তব্যে বলেছিলাম - আমি এটি চিহ্নিত করি নি যে আপনি আমার পছন্দ অনুযায়ী এটি করেছেন।
পিজেট্রাইল

0

কোড তাড়াতাড়ি লেখা যেতে পারে, তবে উপরের কোডটি আমার পৃথিবীতে আরও ভাল ভেরিয়েবলের নাম দিয়ে লেখা উচিত।

এবং যদি আমি কোডটি সঠিকভাবে পড়ে থাকি তবে এটি গ্রসমার্গিন গণনা করার চেষ্টা করছে is

var totalSales = CostOut;
var totalCost = CostIn;
var profit = (decimal)(CostOut - CostIn);
var grossMargin = 0m; //profit expressed as percentage of totalSales

if(profit > 0)
{
    grossMargin = profit/totalSales*100
}

3
আপনি শূন্যের সাথে শূন্যের বিভাজনটি হারিয়েছেন।
danny117

1
এবং এজন্যই কারও কোডটি রিফ্যাক্টর করা জটিল যে ব্রেভিটি সবচেয়ে বেশি এবং কেন / কীভাবে কাজ করে তা ব্যাখ্যা করার জন্য অতিরিক্ত মন্তব্য করা ভাল
রুডলফ ওলা

0

আমি CostIn * CostOut পূর্ণসংখ্যা অভিমানী করছি
এভাবেই আমি এটা লিখতে হবে হয়
এম (অর্থ) দশমিক হয়

return CostIn > 0 && CostOut > 0 ? 100M * (CostOut - CostIn) / CostOut : 0M;

1
আশা করি তারা দুজনই নেতিবাচক চিন্তাভাবনা নয়: পি
ওয়ালফ্র্যাট

2
শূন্য দ্বারা বিভাজন এখনও আছে কি?
danny117

@ danny117 যখন ব্রেভিটি ভুল উত্তর দেয় তখন তা চলে যায়।
পাপারাজ্জো

প্রশ্নটি আপডেট করতে এবং এটি সক্রিয় করতে চান না। 100 এম এবং 0 এম দশমিককে জোর করে। আমি মনে করি (CostOut - CostIn) পূর্ণসংখ্যার গণিত হিসাবে সঞ্চালিত হবে এবং তারপরে পার্থক্যটি দশমিক cast
পাপারাজ্জো

0

কোড লোকেদের বোঝার জন্য লেখা; এই ক্ষেত্রে সংক্ষিপ্ততা বেশি কিনতে না এবং রক্ষণাবেক্ষণকারীদের উপর বোঝা বাড়িয়ে তোলে। এই বংশবৃদ্ধির জন্য, আপনার একেবারে প্রসারিত হওয়া উচিত কোডটি আরও স্ব-ডকুমেন্টিং (আরও ভাল ভেরিয়েবলের নাম) তৈরি করে বা এটি কেন এইভাবে কাজ করে তা ব্যাখ্যা করার জন্য আরও মন্তব্য যুক্ত করে ।

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


1
এখানেই সফ্টওয়্যার ইঞ্জিনিয়ারিং অনুশীলন এবং নীতিগুলি কার্যকর হয়। অ-কার্যকরী প্রয়োজনীয়তা
হাঞ্জোলো

0

যখন স্তনবৃত্তি আর কোন গুণ নেই

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

যখন একটি দীর্ঘ যথেষ্ট উত্তর নেই।

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

2
ঠিক আছে আমি আরও জটিল জিনিসগুলি অন্তর্ভুক্ত করার জন্য উত্তরটি প্রসারিত করেছি যা আমি কঠোর কোড এবং সহজ পদ্ধতিতে সংক্ষিপ্ত কোড লেখার পক্ষে শিখেছি।
danny117

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

আমি স্রেফ অ্যান্ড্রয়েডের মাধ্যমে সম্পাদনা করেছি এবং এটি সম্পাদনার কোনও বিবরণ চায়নি। আমি আশাবাদী আপডেট যোগ করেছি (পরিবর্তিত এবং সতর্কতা সনাক্ত করুন)
ড্যানি 117

0

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

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

কোডের "পাঠযোগ্যতা" এর মতো অ-কার্যকরী প্রয়োজনীয়তার সাথে যখন কাজ করা হয় তখন এটিকে উন্নয়ন ব্যবস্থাপক দ্বারা সংজ্ঞায়িত করা উচিত এবং নেতৃত্বের বিকাশকারী দ্বারা পরিচালিত হওয়া উচিত এবং সঠিক বাস্তবায়ন নিশ্চিত করতে বিকাশকারীদের দ্বারা শ্রদ্ধা করা উচিত।

"পঠনযোগ্যতা" এবং "রক্ষণাবেক্ষণযোগ্যতা" স্বাচ্ছন্দ্য নিশ্চিত করতে কোডের একটি মানক বাস্তবায়ন (মানদণ্ড এবং সম্মেলনগুলি) নিশ্চিত করার চেষ্টা করুন। তবে এই মানের গুণাবলী যদি সংজ্ঞায়িত এবং প্রয়োগ না করা হয় তবে আপনি উপরের উদাহরণের মতো কোড দিয়ে শেষ করবেন।

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

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