ছোট পুনরাবৃত্তি কোড বিভাগগুলির জন্য কখন একটি ফাংশন / পদ্ধতি তৈরি করতে হবে তার একটি ভাল কোড অনুশীলন কী?


12

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

উত্তর:


29

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

উদাহরণস্বরূপ, "ক্লিন কোড" এ রবার্ট সি মার্টিন নীচের উদাহরণটি দিয়েছেন: আপনি কোনটি দেখতে চান? এই:

// Check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) &&
    (employee.age > 65))

অথবা এটা?

if (employee.isEligibleForFullBenefits())

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

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


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

11
আমি এই উদাহরণ পছন্দ। হঠাৎ আপনার আর সেই মন্তব্যের দরকার নেই। এটি থাম্বের নিয়ম : আপনার মন্তব্যটি যদি কোনও ভেরিয়েবল বা ফাংশন নামে রূপান্তর করা যায় তবে এটি করুন!
করলি হরভাথ

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

+1 এই ধরণের কোডটি আরও দ্রুততর হতে পারে, কমপক্ষে যদি এটির জন্য জআইটি-এড দরকার হয় - আপনি কেবল যা ব্যবহার করেন তার জন্য আপনি অর্থ প্রদান করেন।
কাজ

1
ইচ্ছাকৃত উদ্ঘাটন নাম হিসাবেও পরিচিত ।
rwong

13

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


1
কোনও মন্তব্য লেখা এড়াতে প্রোগ্রামাররা কত দৈর্ঘ্যে যাবে তা দেখুন?
মধ্যে Alger

1
@ তাদের যতটা উচিত ঠিক
ততক্ষণ

6

যদি এটি একাধিক জায়গায় ব্যবহৃত হয় , এবং

  • এটি পরিবর্তন হতে পারে, বা
  • এটি সঠিকভাবে পাওয়া কঠিন

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


3
প্রশ্নটি হ'ল: কেন আপনি সাধারণভাবে পুনরাবৃত্তি হওয়া কোডের জন্য কোনও ফাংশন লিখবেন না যদিও সঠিক হওয়া বা পরিবর্তিত হওয়ার সম্ভাবনা ছিল না? (আমার থাম্বের নিয়ম: যদি এর পুনরাবৃত্তি হয় এবং তারপরে যদি আরও বেশি পরে কোনও ফাংশন কল করা হয় তবে এটি একটি ফাংশন করুন)
উইনস্টন ইওয়ার্ট

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

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

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

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

4

প্রায় সর্বদা, বিশেষত যদি প্রতিটি সদৃশ ধারণা ধারণার দিক থেকে একই ক্রিয়াকে উপস্থাপন করে। যদি এটি একইভাবে সঞ্চালিত হয় তবে বিভিন্ন ধরণের, একটি জেনেরিক বাস্তবায়ন করুন।

না করার একমাত্র কারণটি আমি রক্ষণাবেক্ষণের একটি হিসাবে ভাবতে পারি: কখনও কখনও কিছু অনুলিপি ব্যয় করে এমনকি পৃথক জিনিসের মধ্যে নির্ভরতা তৈরি করা এড়ানো আরও সুবিধাজনক হতে পারে।


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

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

1

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


0

যদি কোডটি একাধিক স্থানে হুবহু পুনরাবৃত্তি হয় এবং অদূর ভবিষ্যতে পুনরাবৃত্তিটি পরিবর্তন হয় না তবে আমি এটিকে একটি ফাংশন হিসাবে বিভক্ত করি।


1
যদি এটি পরিবর্তন হতে চলেছে তবে এটিকে পুনরুদ্ধার করার আরও আরও বেশি কারণ। তারপরে আপনাকে কেবল একবার এটি পরিবর্তন করতে হবে
ug

0

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

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

কোড সংহতি ধারণা সম্পর্কে উইকিপিডিয়া নিবন্ধ দেখুন ।


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

0

কাঠামোগত প্রোগ্রামিং অর্থে এবং শ্রেণীর পদ্ধতিগুলির মধ্যে আপনাকে ফাংশনগুলির মধ্যে পার্থক্য করতে হবে।

আপনার উদাহরণে, আপনি যা দেখিয়েছেন তা হ'ল একটি পদ্ধতি যা ইন-লাইনে কোড করা উচিত নয়।

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

এই পার্থক্যটি বিশেষত বড় প্রকল্পগুলিতে গুরুত্বপূর্ণ।

আপনার যতটুকু সম্ভব, ব্যবসায়ের নিয়মগুলি (যে পদ্ধতিগুলি) কম্পিউটিং অ্যালগরিদমগুলি (যা খাঁটি প্রোগ্রামিং ফাংশন) থেকে আলাদা করার চেষ্টা করুন।

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