শ্রেণীর পদ্ধতির সংজ্ঞা অর্ডার করার সর্বাধিক মানব-বান্ধব উপায়?


38

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

  1. অর্ডার কি ব্যাপার?
  2. "সেরা" অর্ডার আছে?
  3. আমি অনুমান করছি যে সেখানে নেই, তাই বিভিন্ন ক্রম কৌশলগুলি কী কী?

1
লোকেরা কেবল পদ্ধতিগুলি পুনরায় অর্ডার করার জন্য কোড কাটা / পেস্ট করবেন বলে আপনি সত্যই আশা করেন না। আইডিই যদি এটি স্বয়ংক্রিয়ভাবে করে তবে জরিমানা। অন্যথায়, এটি কার্যকর করা কঠিন।
চুল্লী

স্পষ্ট করে বলার জন্য, আমার প্রশ্নটি পাঠযোগ্যতা / ব্যবহারযোগ্যতা সম্পর্কে, সিনট্যাক্স নয়।
জনট্রন

উত্তর:


52

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

আমার প্রিয় মার্টিন ফাউলারের উক্তিটি: Any fool can write code that a computer can understand. Good programmers write code that humans can understand.তাই আমি বলব যে আপনার শ্রেণীর ক্রমটি নির্ভর করা উচিত যা মানুষের পক্ষে বুঝতে সহজ করে তোলে তার উপর।

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

সম্পাদনা:

"উল্লম্ব দূরত্ব" এর প্রাথমিক ধারণাটি হ'ল আপনি এটিকে বোঝার জন্য আপনার উত্স কোডের চারপাশে লোককে ঝাঁপিয়ে পড়া এড়াতে চান। যদি বিষয়গুলি সম্পর্কিত হয়, তবে তাদের একসঙ্গে হওয়া উচিত। সম্পর্কযুক্ত জিনিসগুলি আরও দূরে হতে পারে।

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

সুতরাং এখানে একটি স্বীকৃত উদাহরণ যা বিভিন্ন উপায়ে খারাপ (ওও নকশার নকশা; doubleঅর্থের জন্য কখনই ব্যবহার করবেন না ) তবে ধারণাটি চিত্রিত করে:

public class Employee {
  ...
  public String getEmployeeId() { return employeeId; }
  public String getFirstName() { return firstName; }
  public String getLastName() { return lastName; }

  public double calculatePaycheck() {
    double pay = getSalary() / PAY_PERIODS_PER_YEAR;
    if (isEligibleForBonus()) {
      pay += calculateBonus();
    }
    return pay;
  }

  private double getSalary() { ... }

  private boolean isEligibleForBonus() {
    return (isFullTimeEmployee() && didCompleteBonusObjectives());
  }

  public boolean isFullTimeEmployee() { ... }
  private boolean didCompleteBonusObjectives() { ... }
  private double calculateBonus() { ... }
}

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

getFirstNameএবং getLastNameধারণাগতভাবে সম্পর্কিত (এবং getEmployeeIdসম্ভবত খুব বেশি), তাই তারা একত্রে কাছাকাছি রয়েছে। আমরা এগুলি সমস্তকে নীচে নিয়ে যেতে পারি, তবে আমরা getFirstNameশীর্ষে এবং getLastNameনীচে দেখতে চাই না ।

আশা করি এটি আপনাকে প্রাথমিক ধারণা দেয়। আপনি যদি এই ধরণের বিষয়ে আগ্রহী হন তবে আমি দৃ strongly়ভাবে পড়ার পরামর্শ দিচ্ছি Clean Code


আমার জানার দরকার কীভাবে সেটার এবং গেমস অফ ইনস্ট্যান্স ভেরিয়েবল স্থাপন করা দরকার। এটি ক্লাস কনস্ট্রাক্টরের ঠিক পরে বা ক্লাসের নীচে আসা উচিত?
শ্রীনিবাস

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

calculateBonus()আগে আসা উচিত ছিল না isFullTimeEmployee()এবং didCompleteBonusObjectives()?
উইঙ্কলারr

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

2

আমি সাধারণত ব্যবহারের সম্পর্ক এবং ক্রম দ্বারা আমার পদ্ধতিগুলি অর্ডার করি।

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

স্পষ্টতই সমস্ত শ্রেণী এই প্যাটার্নে খাপ খায় না, তবে এটি আমার সাধারণ কর্মপ্রবাহ।

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

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

শ্রদ্ধা হিসাবে এটা কোন ব্যাপার?

পাঠযোগ্যতার জন্য, অবশ্যই।

অন্যটি সত্যই নয়, কেবলমাত্র সেই ক্ষেত্রে যেখানে নির্দিষ্ট ভাষাগুলি পদ্ধতিটিকে কল করতে পারে না যদি না এটির উপরে বর্ণিত না হয় যেখানে এটি বলা হয় ইত্যাদি unless


0

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

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

তারপরে, এগুলির প্রতিটিটির অভ্যন্তরে, এটি কার্যকারিতা দ্বারা গোষ্ঠী পদ্ধতিগুলির সর্বাধিক জ্ঞান তৈরি করে: একটি ব্লকের নির্মাণকারী এবং ডেস্ট্রাক্টর, অন্যটিতে গেটার / সেটটার, অপারেটর ওভারলোড, স্থির পদ্ধতি এবং বাকী গুচ্ছ unch সি ++ তে আমি operator=কন্সট্রাক্টরের কাছাকাছি থাকতে চাই , কারণ এটি অনুলিপিটির সাথে অনুলিপি সম্পর্কিত, এবং কারণ আমি ডিফল্ট কর্টর, অনুলিপি কর্ণধার, অপারেটর = এবং ডিটারের সমস্ত (বা কিছুই নয়) দ্রুত চিহ্নিত করতে সক্ষম হতে চাই বিদ্যমান।


-1

TL; ড

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


ঘ। অর্ডার কি ব্যাপার?

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

void funcA()
{
   funcB();
}

void funcB()
{
   //do something interesting...
}

আপনি একটি ত্রুটি পাবেন কারণ আপনি funcB()এটি ব্যবহার করার আগে কল করেছিলেন। আমি মনে করি এটি পিএল / এসকিউএল এবং সম্ভবত সি-তেও একটি সমস্যা, তবে আপনার ফরোয়ার্ড ঘোষণা থাকতে পারে যেমন:

void funcB();

void funcA()
{
   funcB();
}

void funcB()
{
   //do something interesting...
}

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

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

ঘ। "সেরা" অর্ডার আছে?

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

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

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