কেবল আরও ভাল পঠনযোগ্যতার স্বার্থে কোনও সংগ্রহকে সাধারণ শ্রেণিতে আবদ্ধ করা কি ওভারকিল?


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
এটি কী কী যা শব্দ ইভেন্টের তালিকাকে একটি তালিকার চেয়ে "সেল" করে তোলে? শব্দের এই পছন্দটির অর্থ কি কোনও কোষ তালিকার চেয়ে আলাদা আচরণ করবে বা শেষ পর্যন্ত?
এক্স-কোড

@ ডকব্রাউন কেন? ক্লাসটি হ'ল private staticকারণ এটি কেবল বহিরাগত শ্রেণি দ্বারা ব্যবহৃত হবে তবে এটি বাইরের শ্রেণীর কোনও নির্দিষ্ট উদাহরণের সাথে সম্পর্কিত নয়। ঠিক কি এর সঠিক ব্যবহার নয় private static?
আভিভ কোহন

2
@ ডক ব্রাউন, আভিভ কোহন: কোনও ভাষা নির্দিষ্ট করার জন্য কোনও ট্যাগ নেই, তাই একই সাথে কোনও কিছু সঠিক ও ভুল হতে পারে!
এমিলিও গারাভাগলিয়া

@ এমিলিও গারাভাগলিয়া: জাভা (আমি মনে করি সিনট্যাক্স দ্বারা এটি জাভা বা সি # হতে পারে, এবং কনভেনশনগুলি জাভা পর্যন্ত সংকীর্ণ করেছে;)) এটি পরিষ্কার মনে হয়েছে।)
আভিভ কোহন

উত্তর:


12

এটি মোটেও ওভারকিল নয়। "আমি একটি হ্যাশম্যাপ ব্যবহার করতে পারি" দিয়ে শুরু না করে আপনার প্রয়োজনীয় ক্রিয়াকলাপগুলি শুরু করুন। কখনও কখনও একটি হ্যাশম্যাপ আপনার প্রয়োজন মতো হয়।
আপনার ক্ষেত্রে আমি সন্দেহ করি যে এটি তা নয়। আপনি সম্ভবত যা করতে চান তা হ'ল:

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(..))নিম্ন স্তরের স্ট্যাপগুলি আবদ্ধ করতে এবং করতে পারি :)
আভিভ কোহন

14

যদিও এটি কিছু ক্ষেত্রে পাঠযোগ্যতায় সহায়তা করতে পারে তবে এটি জিনিসগুলিকে জটিল করে তুলতে পারে। প্রারম্ভিক পড়ার সময় আমি নতুনভাবে মোড়ক হিসাবে প্রবাহের স্বার্থে সংগ্রহগুলি মোড়ানো বা প্রসারিত করা থেকে ব্যক্তিগতভাবে ঝুঁকিতে পড়েছি যা আমাকে সচেতন হওয়ার দরকার আচরণ হতে পারে aware এটিকে নূন্যতম আশ্চর্যের একটি ছায়া বিবেচনা করুন।

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

তাহলে, অপরপক্ষে, আপনি একটি ব্যবহার ক্ষেত্রে যে খুঁজে বের করছি না যোগ আচরণ থেকে উপকার হয়, তাহলে আপনি একটি পূর্ণাঙ্গ বর্গ তৈরি করে কোড আরও উন্নত করার জন্য একটি আর্গুমেন্ট আছে।


11
একটি মোড়ক অপরিবর্তিত আচরণ অপসারণ (বা গোপন) করতেও ব্যবহার করতে পারে।
রোমান রেইনার

4
@ রোমানরাইনার - আমি এই জাতীয় বিষয়গুলির বিরুদ্ধে সতর্কতা অবলম্বন করব। আজ অযৌক্তিক আচরণ হ'ল প্রায়শই প্রোগ্রামার আপনার কালকে অভিশাপ দেয়। প্রত্যেকেই জানে যে একটি কী Listকরতে পারে এবং এটি একটি যুক্তিসঙ্গত কারণেই এটি করে does
টেলাস্টিন

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

2

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

private static class SoundEventCell : List<SoundEvent>
{
}

আপনি এখনও আপনার উদাহরণ থেকে কোডটি লিখতে পারেন।

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

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


-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>( ডক্স ) দিয়ে আপনার প্রতিস্থাপন করা আরও ভাল করতে চান , কারণ এটি প্রায়শই নাল-চেক করার যুক্তি এবং ত্রুটিগুলি সংরক্ষণ করে))

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