कुछ प्रोग्रामिंग भाषाओं में, ऑर्डर मायने रखता है क्योंकि आप घोषित होने के बाद तक चीजों का उपयोग नहीं कर सकते हैं। लेकिन ज्यादातर भाषाओं के लिए, यह संकलक के लिए कोई फर्क नहीं पड़ता। तो फिर, आप इसे मनुष्यों के लिए छोड़ रहे हैं।
मेरा पसंदीदा मार्टिन फाउलर उद्धरण है: 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
पर और नीचे देखना नहीं चाहेंगे ।
उम्मीद है कि यह आपको मूल विचार देता है। यदि आप इस तरह की चीज में रुचि रखते हैं, तो मैं दृढ़ता से पढ़ने की सलाह देता हूं Clean Code
।