আমরা কি স্থির পদ্ধতি অপব্যবহার করছি?


13

কয়েক মাস আগে আমি একটি নতুন প্রকল্পে কাজ শুরু করেছিলাম এবং কোডটি দিয়ে যাওয়ার সময় এটি আমাকে ব্যবহৃত স্ট্যাটিক পদ্ধতিগুলির পরিমাণকে স্ট্রোক করে। কেবল ইউটিলিটি পদ্ধতি হিসাবেই নয় collectionToCsvString(Collection<E> elements), এতে প্রচুর ব্যবসায়িক যুক্তিও রাখা হয়।

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

@Service
public class CustomerReceiptCreationService {

    public CustomerReceipt createReceipt(Object... args) {
        CustomerReceipt receipt = new CustomerReceipt();
        // creation logic
        return receipt;
    }
}

এখন, লোকটি বলেছে যে সে স্প্রিংয়ের দ্বারা অযথা পরিচালিত ক্লাস করা অপছন্দ করে, কারণ এটি ক্লায়েন্ট ক্লাসগুলি তাদের নিজেরাই বসন্তের মটরশুটি হওয়া উচিত। আমরা স্প্রিংয়ের মাধ্যমে পরিচালিত সমস্ত কিছু শেষ করি, যা প্রক্রিয়াগত উপায়ে স্টেটলেস অবজেক্টের সাথে কাজ করতে আমাদের বেশ বাধ্য করে। কম-বেশি যা এখানে বর্ণিত হয়েছে তা https://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html

উপরের কোডটির পরিবর্তে তার রয়েছে

public class CustomerReceiptCreator {

    public static CustomerReceipt createReceipt(Object... args) {
        CustomerReceipt receipt = new CustomerReceipt();
        // creation logic
        return receipt;
    }
}

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

new CustomerReceiptCreator().createReceipt()

তিনি দাবি করেন যে স্থির পদ্ধতির কিছু বাড়তি সুবিধা রয়েছে। যথা:

  • পড়া সহজ। স্থিতিশীল পদ্ধতিটি আমদানি করুন এবং আমাদের কেবল ক্রিয়াকলাপের যত্ন নেওয়া দরকার, কোন শ্রেণি এটি করছে না।
  • স্পষ্টতই ডিবি কলমুক্ত একটি পদ্ধতি, সুতরাং কর্মক্ষমতা অনুযায়ী সস্তা; এবং এটি পরিষ্কার করে দেওয়া একটি ভাল জিনিস, যাতে সম্ভাব্য ক্লায়েন্টকে কোডে প্রবেশ করা এবং এটির জন্য পরীক্ষা করা প্রয়োজন।
  • পরীক্ষা লিখতে আরও সহজ Eas

তবে আমি কেবল অনুভব করি যে এটির সাথে পুরোপুরি ঠিক নেই এমন কিছু আছে, তাই আমি এই বিষয়ে আরও কিছু পাকা বিকাশকারীদের ধারণা শুনতে চাই।

সুতরাং আমার প্রশ্নটি হল, প্রোগ্রামিংয়ের এই পদ্ধতিটির সম্ভাব্য সমস্যাগুলি কী কী?




4
staticপদ্ধতি যা আপনি উপরে ব্যাখ্যা করা হয় একজন সাধারণ কারখানা পদ্ধতি। কারখানার পদ্ধতিগুলি স্থির করে তোলা বেশ কয়েকটি বাধ্যতামূলক কারণে সাধারণভাবে গৃহীত কনভেনশন। এখানে কারখানার পদ্ধতি উপযুক্ত কিনা তা আলাদা বিষয়।
রবার্ট হার্ভে

উত্তর:


23

মধ্যে পার্থক্য কি new CustomerReceiptCreator().createReceipt()এবং CustomerReceiptCreator.createReceipt()? বেশ কিছু না। কেবলমাত্র তাত্পর্যপূর্ণ পার্থক্যটি হ'ল প্রথম ক্ষেত্রে যথেষ্ট বিশ্রী সিনট্যাক্স থাকে। যদি আপনি এই বিশ্বাসে প্রথমটিকে অনুসরণ করেন যে কোনওভাবে স্থিতিশীল পদ্ধতিগুলি এড়ানো আপনার কোডটিকে ওও আরও উন্নত করে তোলে, তবে আপনি মারাত্মকভাবে ভুল হয়ে গেছেন। এটিতে কেবল একটি একক পদ্ধতিতে কল করার জন্য একটি অবজেক্ট তৈরি করা অবজেক্ট সিনট্যাক্স দ্বারা স্থির পদ্ধতি।

জিনিসগুলি যখন আলাদা হয় তখন তা যখন আপনি এটির CustomerReceiptCreatorপরিবর্তে ইনজেক্ট করেন new। আসুন একটি উদাহরণ বিবেচনা করুন:

class OrderProcessor {
    @Inject CustomerReceiptCreator customerReceiptCreator;

    void processOrder(Order order) {
        ...
        CustomerReceipt receipt = customerReceiptCreator.createReceipt(order);
        ...
    }
}

আসুন এটি একটি স্ট্যাটিক পদ্ধতি সংস্করণ তুলনা করুন:

void processOrder(Order order) {
    ...
    CustomerReceipt receipt = CustomerReceiptCreator.createReceipt(order);
    ...
}

স্ট্যাটিক সংস্করণের সুবিধাটি হ'ল আমি সহজেই আপনাকে বলতে পারি যে এটি কীভাবে সিস্টেমের বাকী অংশের সাথে ইন্টারেক্ট করে। এটা হয় না। যদি আমি বিশ্বব্যাপী ভেরিয়েবল ব্যবহার না করে থাকি তবে আমি জানি যে সিস্টেমের বাকী কোনওরকম কোনও পরিবর্তন হয়নি। আমি জানি যে সিস্টেমের অন্য কোনও অংশ এখানে রসিদকে প্রভাবিত করতে পারে না যদি আমি অপরিবর্তনীয় বস্তু ব্যবহার করি তবে আমি জানি যে আদেশটি পরিবর্তিত হয়নি, এবং ক্রিয়েআরসিপ্ট একটি খাঁটি ফাংশন। সেক্ষেত্রে অন্য কোথাও এলোমেলো অপ্রত্যাশিত প্রভাব সম্পর্কে চিন্তা না করে আমি অবাধে এই কলটি সরিয়ে / অপসারণ / ইত্যাদি করতে পারি।

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

অন্যদিকে, CustomerReceiptCreatorহঠাৎ করে নতুন নির্ভরতার প্রয়োজন হলে কী হবে ? ধরা যাক এটির জন্য একটি বৈশিষ্ট্যযুক্ত পতাকা চেক করা দরকার। আমরা ইনজেকশন দিলে আমরা এর মতো কিছু করতে পারি:

public class CustomerReceiptCreator {
    @Injected FeatureFlags featureFlags;

    public CustomerReceipt createReceipt(Order order) {
        CustomerReceipt receipt = new CustomerReceipt();
        // creation logic
        if (featureFlags.isFlagSet(Flags::FOOBAR)) {
           ...
        }
        return receipt;
    }
}

তারপরে আমাদের কাজ শেষ হয়েছে, কারণ কলিং কোডটি এমন একটি ইনজেকশন দেওয়া CustomerReceiptCreatorহবে যা স্বয়ংক্রিয়ভাবে একটি ইনজেকশনে আসবে FeatureFlags

আমরা যদি স্থির পদ্ধতি ব্যবহার করতাম?

public class CustomerReceiptCreator {
    public static CustomerReceipt createReceipt(Order order, FeatureFlags featureFlags) {
        CustomerReceipt receipt = new CustomerReceipt();
        // creation logic
        if (featureFlags.isFlagSet(Flags::FOOBAR)) {
           ...
        }
        return receipt;
    }
}

কিন্তু অপেক্ষা করো! কলিং কোডটিও আপডেট করা দরকার:

void processOrder(Order order) {
    ...
    CustomerReceipt receipt = CustomerReceiptCreator.createReceipt(order, featureFlags);
    ...
}

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

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

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