क्या केवल बेहतर पठनीयता के लिए एक संग्रह को एक साधारण वर्ग में लपेटना अधिक है?


15

मेरा निम्नलिखित नक्शा है:

Map<Double, List<SoundEvent>> soundEventCells = new HashMap<Double, List<SoundEvent>>();

इस HashMapमानचित्र doubleमान (जो समय के बिंदु हैं) से संबंधित SoundEvent'सेल': प्रत्येक 'सेल' में कई संख्याएँ हो सकती हैं SoundEvent। इसलिए इसे एक के रूप में लागू किया गया है List<SoundEvent>, क्योंकि यह वास्तव में यही है।

कोड की बेहतर पठनीयता के लिए, मैंने इस तरह एक बहुत ही सरल स्थिर आंतरिक वर्ग को लागू करने के बारे में सोचा:

private static class SoundEventCell {
    private List<SoundEvent> soundEvents = new ArrayList<SoundEvent>();
    public void addEvent(SoundEvent event){
        soundEvents.add(event);
    }
    public int getSize(){
        return soundEvents.size();
    }
    public SoundEvent getEvent(int index){
        return soundEvents.get(index);
    }
    // .. remove() method unneeded
}

और उदाहरण के लिए मानचित्र घोषणा (और बहुत से अन्य कोड) बेहतर दिखेंगे, उदाहरण के लिए:

Map<Double, SoundEventCell> soundEventCells = new HashMap<Double, SoundEventCell>();

क्या यह ओवरकिल है? क्या आप अपनी परियोजनाओं में ऐसा करेंगे?


कोई यह तर्क दे सकता है कि यह वैचारिक रूप से संबोधित किया गया है, यदि आपको पढ़ा जाने योग्य और आसानी से बनाए रखने योग्य कोड लिखा जाए तो आपको कैसे पता चलेगा? यदि आपके साथी आपके काम करने के तरीके के बारे में शिकायत करते रहते हैं, तो यह एक तरीका है या कोई और, आप उन्हें बेहतर महसूस करने के लिए बेहतर बदलाव करते हैं
gnat

1
वह क्या है जो ध्वनि की घटनाओं को एक सूची के बजाय "सेल" बनाता है? क्या शब्दों के इस विकल्प का मतलब है कि एक सेल के पास या अंततः एक सूची की तुलना में अलग व्यवहार होगा?
एक्स-कोड

@DocBrown क्यों? वर्ग private staticइसलिए है क्योंकि यह केवल बाहरी वर्ग द्वारा उपयोग किया जा रहा है, लेकिन यह बाहरी वर्ग के किसी भी विशिष्ट उदाहरण से संबंधित नहीं है। क्या यह बिल्कुल सही उपयोग नहीं है private static?
अवीव कोहन

2
@ डॉक ब्राउन, अवीव कोहन: किसी भी भाषा को निर्दिष्ट करने वाला कोई टैग नहीं है, इसलिए एक ही समय में कुछ भी सही और गलत हो सकता है!
एमिलियो गारवाग्लिया

@EmilioGaravaglia: Java (मुझे लगता है कि यह बहुत स्पष्ट है क्योंकि सिंटैक्स को देखते हुए यह जावा या C # हो सकता है, और सम्मेलनों ने इसे जावा तक सीमित कर दिया है;))।
अवीव कोहन

जवाबों:


12

यह ओवरकिल नहीं है। "मुझे एक HashMap का उपयोग कर सकते हैं" के साथ शुरू करने के बजाय आपके द्वारा आवश्यक संचालन के साथ शुरू करें। कभी-कभी एक HashMap सिर्फ तुम क्या जरूरत है।
आपके मामले में मुझे संदेह है कि यह नहीं है। आप शायद ऐसा कुछ करना चाहते हैं:

public class EventsByTime {
    public EventsByTime addEvent(double time, SoundEvent e);
    public List<SoundEvent> getEvents(double time);
    // ... more methods specific to your use ...
}

आप निश्चित रूप से यह कहते हुए कोड का एक गुच्छा नहीं चाहते हैं:

List<SoundEvent> events = eventMap.get(time);
if (events == null) {
   events = new ArrayList<SoundEvent>();
   eventMap.put(time, events);
}

या हो सकता है कि आप सिर्फ अमरूद मल्टीपैप कार्यान्वयन में से एक का उपयोग कर सकें ।


तो आप एक वर्ग का उपयोग करने की वकालत करते हैं, जो अनिवार्य रूप से एक सूचना-छिपाई तंत्र है, ... सूचना तंत्र छिपाना? डर।
रॉबर्ट हार्वे

1
वास्तव में, हाँ, मेरे पास TimeLineउस तरह की चीज़ के लिए एक वर्ग है :) यह एक पतली आवरण है जिसके चारों ओर HashMap<Double, SoundEventCell>(आखिरकार मैं विचार के SoundEventCellबजाय गया List<SoundEvent>था)। इसलिए मैं बस कर सकता हूं timeline.addEvent(4.5, new SoundEvent(..))और निम्न-स्तरीय सामान को संक्षिप्त कर दिया गया :)
Aviv Cohn

14

हालांकि यह कुछ क्षेत्रों में पठनीयता में सहायता कर सकता है, यह चीजों को जटिल भी कर सकता है। मैं व्यक्तिगत रूप से तरलता की खातिर संग्रह या विस्तार करने से दूर रहता हूं, क्योंकि नए आवरण के रूप में, प्रारंभिक पढ़ने पर, मेरा तात्पर्य है कि ऐसा व्यवहार हो सकता है जिसके बारे में मुझे जागरूक होने की आवश्यकता है। इसे कम से कम आश्चर्य के सिद्धांत की छाया पर विचार करें।

इंटरफ़ेस कार्यान्वयन के साथ चिपके रहने का मतलब है कि मुझे केवल इंटरफ़ेस के बारे में चिंता करने की आवश्यकता है। ठोस कार्यान्वयन, निश्चित रूप से, घर का अतिरिक्त व्यवहार हो सकता है, लेकिन मुझे इसके बारे में चिंता करने की आवश्यकता नहीं है। इसलिए, जब मैं किसी के कोड के माध्यम से अपना रास्ता खोजने की कोशिश कर रहा हूं, तो मैं पठनीयता के लिए सादे इंटरफेस पसंद करता हूं।

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


11
एक आवरण का उपयोग अनावश्यक व्यवहार को हटाने (या छिपाने) के लिए भी किया जा सकता है।
रोमन रेनर

4
@ रोमिनर - मैं इस तरह की चीजों के खिलाफ चेतावनी देता हूं। अनावश्यक व्यवहार आज अक्सर प्रोग्रामर आपके नाम को कल को कोसता है। हर कोई जानता है कि क्या कर Listसकते हैं, और यह उन सभी चीजों को एक अच्छे कारण के लिए करता है।
तेलस्टिन

मैं कार्यक्षमता को बनाए रखने की इच्छा की सराहना करता हूं, हालांकि मुझे लगता है कि समाधान कार्यक्षमता और अमूर्त के बीच एक सावधान संतुलन है। s के लिए SoundEventCellकार्यान्वित कर सकता है , जो सदस्य को पुनरावृत्ति प्रदान करेगा , इसलिए आप किसी भी सूची के रूप में पढ़ सकते हैं (लेकिन लिख नहीं सकते)। जब मैं भविष्य में कुछ अधिक गतिशील की आवश्यकता हो सकती है, तब मैं लगभग जटिलता का सामना करने में संकोच करता हूं । IterableSoundEventsoundEventsList
नील

2

इसे लपेटना आपकी कार्यक्षमता को केवल उन तरीकों तक सीमित करता है जिन्हें आप लिखने का फैसला करने का निर्णय लेते हैं, मूल रूप से बिना किसी लाभ के अपने कोड को बढ़ाते हैं। बहुत कम से कम, मैं निम्नलिखित प्रयास करूंगा:

private static class SoundEventCell : List<SoundEvent>
{
}

आप अभी भी अपने उदाहरण से कोड लिख सकते हैं।

Map<Double, SoundEventCell> soundEventCells = new HashMap<Double, SoundEventCell>();

उस ने कहा, मैंने केवल यह कभी किया है जब सूची में कुछ कार्यक्षमता है जो स्वयं की आवश्यकता है। लेकिन मुझे लगता है कि आपका तरीका इस पर हावी हो जाएगा। जब तक आपके पास सूची के अधिकांश तरीकों तक पहुंच सीमित करने का कोई कारण नहीं था।


-1

एक अन्य समाधान आपके रैपर वर्ग को एक एकल विधि के साथ परिभाषित करना हो सकता है जो सूची को उजागर करता है:

private static class SoundEventCell
{
    private List<SoundEvent> events;

    public SoundEventCell(List<SoundEvent> events)
    {
        this.events = events;
    }

    public List<SoundEvent> getEvents()
    {
        return events;
    }
}

यह आपको कम से कम कोड के साथ आपकी अच्छी तरह से नामित कक्षा देता है, लेकिन फिर भी आपको इनकैप्सुलेशन देता है, जिससे आप वर्ग को अपरिवर्तनीय बना सकते हैं (निर्माणकर्ता में एक रक्षात्मक प्रतिलिपि बनाकर और उपयोग करके Collections.unmodifiableList )।

(हालांकि, इन सूचियों वास्तव में केवल इस वर्ग में इस्तेमाल किया जा रहा है, मुझे लगता है कि आप अपने को बदलने के लिए बेहतर कर चाहते हैं Map<Double, List<SoundEvent>>एक साथ Multimap<Double, SoundEvent>( डॉक्स ), के रूप में है कि अक्सर अशक्त की जाँच तर्क और त्रुटियों का एक बहुत बचत होती है।)

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