কেবলমাত্র সাধারণ কোডটি কেন্দ্রীভূত করতে ফাংশনগুলি ব্যবহার করা কি ভাল অনুশীলন?


20

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

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

সুতরাং, আপনি কি এই জাতীয় কিছু জন্য একটি ফাংশন ব্যবহার করা উচিত? উপকারিতা কি কি?


2
একক লাইন স্টাফের আলাদা ফাংশনে যাওয়ার ওয়ারেন্ট দেওয়ার জন্য একাধিক জায়গায় ব্যবহৃত হওয়ার চেয়ে বেশি প্রয়োজন।

1
দুর্দান্ত প্রশ্ন। অনেকবার আমি একই ভাবছি।
rdasxy

উত্তর:


31

এটি ফাংশনগুলির দুর্দান্ত ব্যবহার।

এটি একটি সুন্দর রক্তাল্পতা কাজ হবে (খুব বেশি কিছু করে না) ...

এটা ভালো. ক্রিয়াকলাপ কেবল একটি জিনিস করা উচিত।

বরং স্থানীয় ...

ওও ভাষায়, এটি ব্যক্তিগত করুন।

(তাই সাধারণ উদ্দেশ্য নয়)

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

এবং এটি নিজের পক্ষে ভালভাবে দাঁড়ায় না (আপনি এটি কোথায় ব্যবহার করছেন তা না দেখলে আপনার কী প্রয়োজন তা নির্ধারণ করতে পারবেন না)।

এটির জন্য একটি ভাল নাম নিয়ে আসুন এবং এটি নিজেরাই দারুণভাবে দাঁড়িয়ে আছে। "ভ্যালিডেটফাইলপ্যারামিটারস" বা কিছু। এখন নিজেই ঠিক আছে।


6
ওয়েল মাল পয়েন্ট। আমি যুক্ত করব (3) আপনি যখন কোনও এক জায়গায় স্থির করতে পারেন তখন আপনার পুরো কোড বেসে ডুপ্লিকেটেড বাগের জন্য শিকার করা থেকে বিরত রাখব। কোড অনুলিপি খুব দ্রুত একটি রক্ষণাবেক্ষণ জাহান্নাম হতে পারে।
ডেডালনিক্স

2
@ ডিডালনিক্স: ভালো কথা। লেখার সময় আমি বুঝতে পারি যে আমার পয়েন্টগুলি একটি স্থূল ওভার সরলিকরণ। রাইটিং এবং ইজিজার ডিবাগিং অবশ্যই জিনিসগুলিকে ফাংশনে বিভক্ত করার সুবিধা (যেমন টেস্ট পৃথক ফাংশনগুলির ইউনিট করার ক্ষমতা)।
ক্রমিই পুনর্নির্মাণ মনিকা

11

এটি সম্পূর্ণরূপে একটি ফাংশন হওয়া উচিত।

if (isBufferValid(buffer)) {
    // ...
}

অনেক বেশি পঠনযোগ্য এবং আরও বজায় রাখা যায় (যদি চেকের যুক্তি কখনও পরিবর্তন হয় তবে আপনি কেবল এটি একটি জায়গায় পরিবর্তন করবেন)।

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

আমাকে আরও একটি ভাল প্রশ্ন জিজ্ঞাসা করুন। এটি কীভাবে একটি ভাল অনুশীলন করছে না ?

সঠিক কাজটি করো. :)


4
যদি আইফারভালিডটি সহজভাবে হয় return buffer != null;তবে আমি মনে করি আপনি সেখানে পাঠযোগ্যতার ক্ষতি করছেন।
পিডিআর

5
@ পিডিআর: সাধারণ ক্ষেত্রে এটি কেবল পঠনযোগ্যতার ক্ষতি করে যদি আপনার নিয়ন্ত্রণ নিয়ন্ত্রণের মানসিকতা থাকে এবং সত্যই সত্যিকার অর্থে কোডটি কীভাবে চেক করে বাফারটি বৈধ কিনা তা জানতে চাই। সুতরাং এটি simple সাধারণ ক্ষেত্রে বিষয়গত।
Spoike

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

5

আইএমও, কোড স্নিপেটগুলি ফাংশনটি খুব স্বল্প হবে এবং কেবল একবার ব্যবহৃত হবে কিনা তা বিবেচনা না করেই এই কোডটি আরও পঠনযোগ্য করে তুলবে তাদের নিজস্ব ফাংশনে স্থানান্তরিত করার উপযুক্ত ।

সাধারণ জ্ঞান দ্বারা নির্ধারিত অবশ্যই সীমা আছে। উদাহরণস্বরূপ, আপনি WriteToConsole(text)শরীরটি সরল হওয়ার সাথে পদ্ধতিটি রাখতে চান না Console.WriteLine(text)। তবে পাঠ্যতার পক্ষে ভুল করা একটি ভাল অনুশীলন।


2

কোডে সদৃশতা সরিয়ে ফাংশন ব্যবহার করা সাধারণত একটি ভাল ধারণা।

তবে এটি খুব দূরে নেওয়া যেতে পারে। এটি একটি রায় কল।

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

if (buf==null) throw new BufferException("Null read buffer!");

যদি আপনি জেনেরিক নাল চেকিং ফাংশনের প্যারামিটার হিসাবে ত্রুটি বার্তাটি অন্তর্ভুক্ত করেন এবং ফাংশনটি সংজ্ঞায়িত করার জন্য প্রয়োজনীয় কোডটিও বিবেচনা করেন তবে এটির পরিবর্তে এটি কোনও নেট এলওসি সংরক্ষণ নয়:

checkForNullBuffer(buf, "Null read buffer!");

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


যুক্তিযুক্তভাবে, আপনার উদাহরণটি নকলকরণের আসল প্রয়োজনের চেয়ে ভাষায় চুক্তি সহায়তার অভাব সম্পর্কে আরও বলে says তবে যাইহোক ভাল পয়েন্ট।
ডেডালনিক্স

1
আপনি যেমনটি দেখেন ঠিক তেমন বিন্দুটি মিস করেছেন। না ধরে ধাপে বা যুক্তিবিজ্ঞান প্রত্যেক সময় আপনি ডিবাগ বিবেচনা আছে করা কি আমি করছি খুঁজছেন। এটি কীভাবে হয়ে গেছে তা জানতে চাইলে আমি একবার এটি যাচাই করে নিই। প্রতিবার এটি করা সহজভাবে নির্বোধ।
ইয়াম মার্কোভিচ

যদি ত্রুটির বার্তাটি ("নাল রিড বাফার") পুনরাবৃত্তি হয়, তবে সেই অনুলিপি অবশ্যই মুছে ফেলা উচিত।
কেভিন cline

ভাল এটি একটি উদাহরণ তবে সম্ভবত প্রতিটি ফাংশন কল সাইটে আপনার আলাদা বার্তা থাকবে - উদাহরণস্বরূপ "নুল রিড বাফার" এবং "নুল লিখন বাফার"। আপনি প্রতিটি পরিস্থিতির জন্য একই লগ / ত্রুটি বার্তাগুলি না চাইলে আপনি এটি ডি-সদৃশ করতে পারবেন না .......
মাইক্রা

-1 পূর্বশর্তসমূহ.চেকনোটনল একটি ভাল অনুশীলন, খারাপ আচরণ নয়। যদিও স্ট্রিং বার্তা অন্তর্ভুক্ত করার প্রয়োজন নেই। google-collections.googlecode.com/svn/trunk/javadoc/com/google/…
ripper234

2

কোডটি কেন্দ্রীভূত করা সর্বদা একটি ভাল ধারণা। আমাদের যথাসম্ভব পুনরায় ব্যবহার করতে হবে।

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

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

এখানে কিছু প্রশ্ন জিজ্ঞাসার আগে আপনার জিজ্ঞাসা করা উচিত

  1. আপনি যে ক্রিয়াকলাপটির নিজস্ব অন্তর্নিহিত অর্থ তৈরি করছেন তা কি এটি কেবল লাইনগুলির একগুচ্ছ?

  2. অন্য কোন প্রসঙ্গে একই ফাংশন ব্যবহারের প্রয়োজন হবে? সম্ভবত এটি ব্যবহার করার আগে আপনার API কে সামান্য সাধারণকরণের প্রয়োজন হতে পারে?

  3. আপনি ব্যতিক্রম নিক্ষেপ করলে অ্যাপ্লিকেশনগুলির (বিভিন্ন অংশের) প্রত্যাশা কী হবে?

  4. ফাংশনগুলি বিবর্তিত হতে চলেছে তা দেখার মতো পরিস্থিতিতে কী আছে?

ইতিমধ্যে এই জাতীয় জিনিস উপস্থিত আছে কিনা তাও আপনার পরীক্ষা করা উচিত। আমি অনেক লোককে সর্বদা ইতিমধ্যে যা আছে তা অনুসন্ধান করার পরিবর্তে সর্বদা তাদের ম্যাক্রো MIN, MAX পুনরায় সংজ্ঞায়িত করার জন্য ঝোঁক দেখেছে।

মূলত, প্রশ্নটি হল, "এই নতুন ফাংশনটি কি সত্যই পুনরায় ব্যবহারের উপযুক্ত বা এটি কেবল একটি অনুলিপি-পেস্ট ?" এটি যদি প্রথম হয় তবে এটি ভাল।


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

1

কোড দ্বিধা এড়ানো উচিত। প্রতিবার আপনি এটি অনুমান করার সময় আপনার কোডের সদৃশতা এড়ানো উচিত। যদি আপনি এটি অনুমান করেন না, একই বিধিটির 3 বার নকল হওয়ার আগে 3: রিফ্যাক্টরের নিয়মটি প্রয়োগ করুন, 2 বার ডুপ্লিকেট করা হলে কোয়ার্কটি আনোটেট করুন।

একটি কোড সদৃশ কি?

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

নীচের উদাহরণ বিবেচনা করুন:

if(user.getPrileges().contains("admin")) {
    // Do something
}

হয়ে

if(user.isAdmin()) {
    // Do something
}

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


1
বিটিডব্লিউ উদাহরণটি ডেমিটারের আইন চিত্রিত করে।
মার্চ

1

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


0

যদি আপনি এটি সদৃশ দেখেন তবে আপনার এটি কেন্দ্রীভূত করার উপায় খুঁজে পাওয়া উচিত।

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

আপনার যদি অন্য কিছু পরীক্ষা করতে হয় তবে কী হবে?

আপনি অতিরিক্ত চেক যুক্ত করতে বা কেবল একটি ফাংশন পরিবর্তন করতে সমস্ত জায়গাগুলি সন্ধান করছেন?


... অন্যদিকে, যদি খুব বেশি সম্ভাবনা থাকে যে আপনি কখনই এতে কিছু যুক্ত করবেন না। আপনার পরামর্শটি এখনও সেই ক্ষেত্রে কর্মের সেরা কোর্স?
অ্যাপসিলনভেক্টর

1
@ এপসিলনভেেক্টর আমার আঙ্গুলের নিয়মটি হ'ল যদি আমাকে একবার এটি পরিবর্তন করতে হয় তবে আমি এটির পাশাপাশি পুনঃসংশোধকও করতে পারি। সুতরাং, আপনার ক্ষেত্রে আমি এটি ছেড়ে যাব এবং যদি আমাকে এটি পরিবর্তন করতে হয় তবে এটি একটি ফাংশনে পরিণত হবে।
থানোস পাপাথানসিয়ো

0

নিম্নলিখিত শর্তগুলি পূরণ করা গেলে এটি প্রায় সর্বদা ভাল:

  • পঠনযোগ্যতা উন্নত
  • সীমিত সুযোগের মধ্যে ব্যবহার করা হয়

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

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