क्या "प्लस" और "माइनस" उपयुक्त विधि नाम हैं?


21

जावा SE 8 तारीख, शुरू करने के लिए एक नया तंत्र के साथ आता है LocalDate, LocalTimeऔर LocalDateTimeकक्षाओं के लिए समय की instants प्रतिनिधित्व करने के लिए। इस तरह के instants में हेरफेर करने के लिए, तरीकों का एक सेट दिए गए हैं: LocalDate.plusDays(...), LocalDate.minusDays(...)और इतने पर।

मैं हमेशा सोचा है कि अच्छा अभ्यास अपने उद्देश्य का वर्णन क्रियाओं के बाद तरीकों नामकरण किया गया था, के रूप में तरीके हैं, वास्तव में, संचालन निष्पादित किया जाना है, कुछ है कि होगा प्रदर्शन एक कार्रवाई। बस, का उल्लेख करता है, तो आप की तरह वर्गों पर विचार StringBuilder, उदाहरण के लिए, विधियों के नाम हैं append, insert, delete...

यही कारण है कि मेरे लिए यह सही नहीं लग रहा एक विधि नामकरण है plusDaysके बजाय sumDays, minusDaysकी बजाय subtractDays। यह सिर्फ मुझे बहुत कष्टप्रद लग रहा है? तुम क्या सोचते हो?

इसका एकमात्र कारण मैं सोच सकता हूं कि तिथियां अपरिवर्तनीय वस्तुएं हैं, इसलिए कॉल करके plusDaysआप मूल वस्तु में दिन नहीं जोड़ रहे हैं बल्कि नए गुणों के साथ एक नया निर्माण कर रहे हैं, लेकिन यह बहुत सूक्ष्म है।


22
मुझे लगता है कि आप इसे तकनीकी रूप से भी देख रहे हैं। विधि नामों के लिए वास्तविक लक्ष्य यह स्पष्ट करना है कि यह क्या करता है और इसे पठनीय बनाना है। यह सिर्फ पता चला है कि क्रियाओं के साथ उनका नामकरण सामान्य रूप से इन दो लक्ष्यों को पूरा करता है। हालांकि, एक विधि पर विचार करें जिसे sqrtस्क्वायर रूट कहा जाता है । इस विधि का नामकरण takeSqrtआपके नियम के अनुसार हो सकता है, लेकिन इसका नामकरण करने से यह विधि अधिक पठनीय नहीं होगी और न ही यह स्पष्ट हो पाएगी।
ब्रैंडिन

2
प्रोग्रामिंग "अंग्रेजी" नहीं है। उदाहरण के लिए, sqrtकेवल एक शब्द है जिसे प्रोग्रामर को पहचानने और जानने की उम्मीद है। अंग्रेजी शब्द "स्क्वायर रूट" है। लेकिन अंग्रेजी में जो स्वाभाविक है उसके अनुसार चीजों का नामकरण करना अच्छा नहीं है। उदाहरण के लिए, "अवैध" शब्द लें, जो पूरी तरह से ठीक अंग्रेजी शब्द है। हालांकि, अगर किसी ने अपनी विधि का नाम दिया है, तो isIllicitमुझे लगता है कि मैं हर बार इस पद्धति के कॉल को देखने के लिए अपनी आंखें फाड़ना चाहता हूं। यह सिर्फ भयानक लग रहा है और विचार व्यक्त करने का एक बेहतर तरीका होना चाहिए।
ब्रैंडिन

18
sumइस संदर्भ में गलत लगता है। मैं .net के पसंद करते हैं AddDays
कोडइंचोजोस

3
@LuigiCortese सामान्य अंग्रेजी शब्द ऑर्डर करने के लिए विधि नामों को चुना जाता है। Math.addExact(1, 2)क्योंकि आप कहते हैं कि "1 और 2 जोड़ें"। tomorrow.plusDays(2)क्योंकि आप कहते हैं "कल प्लस 2 दिन"। अगर किसी तरह से addExactसदस्य होते Integerतो ऐसा होता 1.plusExact(2)
तवियन बार्न्स

8
व्यक्तिगत रूप से, मैं उम्मीद करूंगा plusDays भविष्य में एक नई तारीख x संख्या को वापस करने की , जबकि addDaysमैं मूल वस्तु को म्यूट करने की उम्मीद कर सकता हूं। हालांकि यह सिर्फ मुझे है, मैं जावा से परिचित नहीं हूं।
Ajedi32

जवाबों:


52

एकमात्र कारण जो मैं सोच सकता हूं, वह यह है कि तिथियां अपरिवर्तनीय वस्तुएं हैं, इसलिए प्लसडेस को कॉल करके आप मूल वस्तु में दिन नहीं जोड़ रहे हैं, बल्कि नए गुणों के साथ एक नया निर्माण कर रहे हैं, लेकिन यह बहुत अलग है।

ठीक यही कारण है। कल्पना कीजिए कि आपके पास शेड्यूलिंग उद्देश्यों के लिए तारीखों की श्रेणी में हेरफेर करने के लिए किसी प्रकार का एपीआई था। यह उन तरीकों को उजागर कर सकता है जो आपको एक बयान देते हैं जैसे:

var workdaySchedule = initialSchedule.withoutWeekends();

यह अंग्रेजी कथन के समान है: "कार्यदिवस अनुसूची सप्ताहांत के बिना प्रारंभिक अनुसूची है"। यह प्रारंभिक अनुसूची को बदलने का मतलब नहीं है , यह काम अनुसूची एक अलग, नई बात होने का तात्पर्य है।

अब इसके बजाय कल्पना कीजिए कि यह नाम था:

var workdaySchedule = initialSchedule.removeWeekends();

यह भ्रामक है। क्या प्रारंभिक अनुसूची को संशोधित किया जा रहा है? यह निश्चित रूप से ऐसा लगता है, क्योंकि यह लगता है जैसे हम कर रहे हैं इसे से सप्ताहांत निकाल । लेकिन फिर हम इसे एक नए चर में क्यों सौंप रहे हैं? हालांकि ये दो नामकरण योजनाएं बहुत समान हैं, लेकिन यह बहुत कम स्पष्ट रूप से स्पष्ट है कि क्या हो रहा है। यदि यह अधिक उचित होगा removeWeekends किया प्रारंभिक शेड्यूल परिवर्तित, और जो मामले में void- लौटेwithoutWeekends भ्रमित विकल्प होगा।


यह अनिवार्य रूप से एक घोषणात्मक बनाम अनिवार्य भेद है। क्या हम यह घोषित कर रहे हैं कि workdayScheduleयह एक विशेष बात है, या क्या हम अनिवार्य की सूची ले रहे हैं इस विशेष चीज को बनाने के लिए निर्देशों (जैसे "हटाएं") की ? जब आप मानों को परिवर्तित कर रहे हों, तो आमतौर पर अत्यावश्यक नामकरण अधिक मायने रखता है, और उपर्युक्त मूल्यों को प्रदर्शित करता है, और घोषणात्मक अपरिवर्तनीय मूल्यों के साथ अधिक समझ में आता है।

आपके मामले में, आपके पास बिल्कुल वही है। अगर मैंने देखा: tomorrow.plusDaysमैं कल्पना नहीं करूंगा कि tomorrowउत्परिवर्तित किया जा रहा है, जबकि tomorrow.addDays, मुझे लगता है कि यह हो सकता है। यह कुछ हद तक सूक्ष्म है- लेकिन जरूरी नहीं कि बुरे तरीके से हो। इसके बारे में बहुत मुश्किल से सोचने के बिना, यह नामकरण स्वाभाविक रूप से आपकी सोच को सही लाइनों के साथ सेट करता है कि आप उत्परिवर्तन कर रहे हैं या नहीं। इन अनिवार्य और घोषणात्मक शैलियों के बीच अंतर को स्पष्ट करने के लिए: "जोड़ें" (और "हटाएं") क्रिया हैं , जबकि "प्लस" (और "बिना") प्रस्ताव हैं


13
मैं वास्तव में के साथ एक समस्या थी addDaysबनाम plusDaysकल! .NET में, DateTimeक्लास में मेथड्स addDays, addMonthsऔर addYears। मैंने एक रिश्तेदार तारीख (1 वर्ष, 2 महीने, 3 दिन पहले) को पार्स करने की विधि बनाई और उपरोक्त तरीकों को यह कहते हुए सोचा कि वे वर्तमान DateTimeवस्तु को संशोधित कर रहे हैं । डेटाबेस में हर तारीख 8 जून, 2015 को समाप्त हो रही थी। "यह मजेदार है," मैंने सोचा। जब मुझे याद आया कि addDaysयह DateTimeवस्तु को संशोधित नहीं करता है , तो यह एक नया रिटर्न देता है । तो + इस सवाल के लिए चारों ओर।
ग्रेग बरगार्ड

1
@GregBurghardt एक .NET उपयोगकर्ता के रूप में, मैं बिल्कुल विपरीत अपेक्षाएं रखता हूं। मुझे लगता है कि इसका मतलब केवल यह है कि "प्लस" और "ऐड" विनिमेय हैं, प्रत्यक्ष मैपिंग के लिए नहीं +और+=
Agent_L

2
@Agent_L यह दिलचस्प है। .NET एक तरफ कन्वेंशन करता है, "जोड़ें" और "प्लस" अंग्रेजी में विनिमेय नहीं हैं।
बेन आरोनसन

1
इसके अलावा, तिथियों और समयों के लिए, यह डी + 1, एच +12 और इतने पर एक विशिष्ट मूल के सापेक्ष संदर्भ समय (भी, अंतरिक्ष उड़ान टी -10, टी -9, आदि के लिए) के समान है। आमतौर पर, यह डी-प्लस -1, एच-प्लस -12, टी-माइनस -10 के रूप में पढ़ा जाता है। शायद अमेरिका केंद्रित है, लेकिन यह है कि यह मुझे कैसे दिखता है।
क्रिस्टियन एच।

4
आपको जॉन स्केट का यह पुराना स्टैकओवरफ़्लो प्रश्न दिलचस्प लग सकता है: एक अपरिवर्तनीय संग्रह पर गैर-म्यूटिंग "ऐड" विधि के लिए सबसे अच्छा नाम क्या है?
माइक्स

2

.NET में नामकरण अलग है, हालांकि परिणाम बिल्कुल समान है। के बजाय:

tomorrow = LocalDateTime.plusDays(1);

वहाँ है:

tomorrow = DateTime.Now.AddDays(1);

इसका मतलब केवल यह है कि "प्लस" और "ऐड" की समझ के बीच अंतर व्यक्तिगत राय के मामले के रूप में समाप्त हो गया। खुश रहो, तुम अकेले नहीं हो, कम से कम तुम उस भाषा को चुन सकते हो जो तुम्हें बेहतर लगती है:)


-1

यह संभवतः .Methodसभी तरीकों के लिए जावा का एक विरूपण साक्ष्य है , जो उन दोनों को जोड़ता है जो ऑब्जेक्ट को संशोधित करते हैं और जो नहीं करते हैं।

एक ऐसी भाषा की कल्पना करें जिसमें एक वाक्य रचना भी हो object=>method, जो methodकाम करने के लिए वस्तु की एक प्रति दे । अब ऐसी भाषा में, startDate=>plusDays(5)स्पष्ट रूप से स्पष्ट नहीं है। यह मूल तारीख लेता है, और एक नई तारीख बनाता है जो 5 दिन बाद है।

एक असंबंधित नोट पर, sumDaysयहाँ कोई मतलब नहीं है। LocalDateएक समय बिंदु है , एक समय अवधि नहीं है । आप किसी भी संख्या में अवधि जोड़ सकते हैं (और परिणाम एक और अवधि है), और आप एक समय बिंदु और एक अवधि जोड़ सकते हैं (परिणाम एक और समय बिंदु है), लेकिन आप समय बिंदुओं का योग नहीं कर सकते।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.