GoF Design প্যাটার্নস - আপনি আসলে কোনটি ব্যবহার করেন? [বন্ধ]


16

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

  • বিমূর্ত কারখানা
  • কারখানার পদ্ধতি
  • একক বস্তু
  • সেতু
  • অট্টালিকার সদরের বহির্ভাগ
  • হুকুম

আপনি বাস্তবে কোনটি ব্যবহার করেন এবং আপনি কীসের জন্য ব্যবহার করেন?

নিদর্শনগুলির তালিকা চাইলে তাদের জন্য লিঙ্ক করুন


7
আইএমএইচও, প্রশ্নটি কার্যকর আলোচনার ফলস্বরূপ ue আপনি কি প্রতি প্যাটার্নের জন্য একটি উত্তর চান বা প্যাটার্নের সংমিশ্রণে একটি উত্তর চান?
মাককে

আপনি এই নিদর্শনগুলি ব্যবহার করার কয়েকটি কারণ কার্যকর হবে, অন্যথায় আপনি কেবল ধারণাগুলি তালিকাবদ্ধ করছেন ... এই প্রশ্নটি জিজ্ঞাসা করুন: "আপনি কী কীওয়ার্ড ব্যবহার করেন?" এবং " for, if, while...ইত্যাদির" তালিকা সংগ্রহ করা - এটি কতটা অর্থহীন হবে তা পরিমাপ করা কঠিন।
ocodo

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

1
এটিকে মোটামুটি আরও সংশোধন করা হয়েছে - আশা করি এটি এখন আরও কিছু ভাল আলোচনা তৈরি করবে।
ক্রেগ শোয়ার্জে

1
আপনি আসলে কোন ধরণের ফল খান? আপনি এই প্রশ্নটি থেকে বেরিয়ে আসার আশা করছেন তা জানতে আগ্রহী। যদি আপনি এমন একটি প্যাটার্ন দেখতে পান যা 3 বা 4 জন ব্যক্তি ব্যবহার করেছেন তবে আপনি করেন নি, এটি কি আপনাকে এটি ব্যবহার করতে বাধ্য করবে?
মার্সি

উত্তর:


4

বাস্তবে আমি কোনটি ব্যবহার করেছি বা দেখেছি তার একটি তালিকা এখানে রয়েছে:

সিঙ্গেলটন - এএসপি-তে অ্যাপ্লিকেশন অবজেক্ট এটির একটি প্রধান উদাহরণ।

অ্যাডাপ্টার - ডেটাবেসগুলিতে সংযোগ স্থাপন করা কমপক্ষে আমার নিজের নেট নেট অংশে অ্যাডাপ্টারের ক্লাসে জড়িত থাকতে পারে।

কারখানা - বস্তু উত্পন্ন করার জন্য সাধারণ যদিও আমি দিনের বেশ কয়েকটি পুরানো ক্লাসিক এএসপিতে এটি আরও দেখেছি।

কৌশল - আমার কাছে একটি অ্যাপ্লিকেশন ছিল যা প্রতিটি ধরণের ডিভাইসের জন্য আমার ক্লাসের জন্য একই ধরণের কাঠামো ছিল যা আমি এই প্যাটার্নটির বাস্তবায়ন বিবেচনা করব।

মুখোমুখি - কিছু উপায়ে এটি অ্যাডাপ্টারের প্যাটার্নের মতো যা সাধারণত বেশ কয়েকটি সিস্টেমে একত্রে আবদ্ধ হয় of


1
সমস্ত বৈধ ব্যবহার। যে কারও জন্য এটি পড়ছেন - মনে রাখবেন যে এই নিদর্শনগুলি অবশ্যই এগুলির মধ্যে সীমাবদ্ধ নয়।
বরিস ইয়াঙ্কভ

5

লেখকরা সত্যিকারের অ্যাপ্লিকেশনগুলিতে পাওয়া পর্যবেক্ষণ নকশাগুলি থেকে নিদর্শনগুলি সংকলন করেছেন। কোনও ব্যক্তি সম্ভবত তাদের সমস্তটি ব্যবহার করবেন না, তবে তারা সবাই ব্যবহৃত হয়।


আপনি কোনটি স্মিথকো ব্যবহার করেছেন এবং কীসের জন্য?
ক্রেগ শোয়ার্জে

@ ক্রেইগস আমি তাদের অনেকগুলি ব্যবহার করেছি। ডিজাইন প্যাটার্নগুলির লেখকরা তাদের বর্ণনা করা প্রতিটি প্যাটার্নের সাথে ভাল উদাহরণগুলির একটি সেট রয়েছে। সবচেয়ে ভাল পরামর্শ আমি দিতে পারি বইটি পুরোপুরি পড়ার জন্য সময় ব্যয় করা।
স্মিথকো

3

সাজসজ্জার

সম্পাদনা : প্রায় প্রতিটি প্রকল্প যা 'তুচ্ছ' পর্যায়ে চলে যায়, তার একটি শেষ হয় আইএাকশন ইন্টারফেসের সাথে (বিবরণ পৃথক হতে পারে):

// Programming Language does not matter
interface IAction {
     bool operateOn(Foo* target);
     string getDisplayName(); // useful for debugging and logging
};

পরের ঘন্টা আমি IAction বাস্তবায়িত অনেক ছোট, প্রায় তুচ্ছ ক্লাস লিখতে ব্যয়। একত্রিত হলে এগুলি খুব শক্তিশালী এবং নমনীয় হয়।

যেমন একটি LogAction(লগ ইন করুন এবং আইএ্যাকশন সম্পাদন করতে লিখুন), NullAction(কিছুই করবেন না এবং সত্যের দিকে প্রত্যাবর্তন করুন), ActionList(আইএএকশনগুলির একটি তালিকা সম্পাদন করুন, এবং বুলগুলির অ্যান্ডিং ফিরিয়ে দিন)। কিছু কিছু ক্ষেত্রে একটি AndAction(দুই কর্মের এবং-ing ফিরে স্বল্প circuited বা হতে পারে না), OrAction, NotActionজানার পাশাপাশি।

যদিও প্রযুক্তিগতভাবে কেবলমাত্র লগঅ্যাকশনটি ডেকোরেটার (অন্যটি ঠিক 1 আইএ্যাকশন চালায় না), আমি আইএকশনের লগঅ্যাকশনগুলির অ্যাকশনলিস্ট তৈরি করার পরেও আমি এটি ডেকোরেটর প্যাটার্নটির একটি সাধারণীকরণ হিসাবে বিবেচনা করি।


আপনার জন্য এটা ব্যবহার করব কি?
ক্রেগ শোয়ার্জে

1
অনুরোধে @ ক্র্যাগ উদাহরণ যোগ করা হয়েছে।
সোজয়ের্ড

এটা আরো প্রসাধক এবং কম্পোজিট আসলে একটি মিশ্রণ, যা সূক্ষ্ম, এবং একটি নিখুঁত দেখায় যে ধরনে অসুবিধা তাদের স্বাধীনভাবে ব্যবহার করা থেকে আসে না মত দেখায়, কিন্তু থেকে তাদের একসঙ্গে মিশ :)
Matthieu এম

হ্যাঁ, এটি ক্লাসিক। এটি কমপোজড পার্ড কমান্ড। এই প্যাটেনটির আসলে একটি নাম রয়েছে: একে "স্পেসিফিকেশন" ( en.wikedia.org/wiki/Specication_ Pattern ) বলা হয়।
মার্টিন উইকম্যান

2

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

অন্যদের মতো আমিও প্রায়শই কারখানার নিদর্শনগুলি ব্যবহার করেছি । তারপর

  • সিঙ্গলটন : আজকাল তেমন কিছু হয় না, তবে এখনও মাঝে মাঝে এটি প্রয়োজনীয় হয় সাধারণত বিশ্বব্যাপী কনফিগারেশন ডেটার জন্য
  • কৌশল এবং টেম্পলেট পদ্ধতি : প্রায়শই প্রায়শই, যেমন আমাদের অ্যাপে বিভিন্ন ধরণের গণনা উপস্থাপনের জন্য
  • নির্মাতা : একটি মেইনফ্রেম সিস্টেমের সাথে আউটপুট অবজেক্টগুলিতে লেনদেনের ফলাফল মার্শেলিংয়ের জন্য (কিছু ক্ষেত্রে এটি পাঠ্যের পার্সিং এবং বৃহত অবজেক্টের শ্রেণিবিন্যাস তৈরির একটি বিস্তৃত পরিমাণ অন্তর্ভুক্ত করে)
  • কমান্ড : আমি বহু বছর আগে এটি একবারে বাস্তবায়ন করেছি, তবে আজকাল আমাদের জাভা প্রকল্পে আমি কল্যাবলগুলি ব্যবহার করি এখন এবং পরে, যা আমি বিশ্বাস করি মূলত কমান্ডগুলি

2

ইতিমধ্যে উল্লিখিত অন্যান্য অনেকগুলি আমি ব্যবহার করেছি (সিঙ্গলটন, কারখানা, নির্মাতা, কমান্ড, কৌশল ইত্যাদি ...)

আমি এখনও উল্লেখ করি নি যে হ'ল ফ্লাইওয়েট, যা আমি প্রচুর ব্যবহার করার প্রবণতা রাখি। আমি নীচে একটি বাস্তবায়ন প্রদান করেছি:

/**
 * Flyweight class representing OCR digits.
 * 
 * @author matt
 *
 */
public class Digit {
    /** Static flyweight map containing Digits which have been encountered. **/
    private static Map digits = new HashMap();

    /** The block of text representing Digit. **/
    private String blockRep = null;

    /** A map representing acceptable blocks of characters and the string representation of their
     * numerical equivalents.
     */
    public static final Map VALID_DIGITS;

    /** Enum of valid digits. **/
    public static enum DigitRep {
        ZERO    (   " _ \n" +
                    "| |\n" +
                    "|_|"       ),

        ONE (       "   \n" +
                    "  |\n" +
                    "  |"       ),

        TWO (       " _ \n" +
                    " _|\n" +
                    "|_ "       ),

        THREE   (   " _ \n" +
                    " _|\n" +
                    " _|"       ),

        FOUR    (   "   \n" +
                    "|_|\n" +
                    "  |"       ),

        FIVE    (   " _ \n" +
                    "|_ \n" +
                    " _|"       ),

        SIX     (   " _ \n" +
                    "|_ \n" +
                    "|_|"       ),

        SEVEN   (   " _ \n" +
                    "  |\n" +
                    "  |"       ),

        EIGHT   (   " _ \n" +
                    "|_|\n" +
                    "|_|"       ),

        NINE    (   " _ \n" +
                    "|_|\n" +
                    " _|"       );

        private String blockRep;

        DigitRep(String blockRep) {
            this.blockRep = blockRep;
        }

        @Override
        public String toString() {
            return blockRep;
        }
    }

    static {
        /* Initialize the map of acceptable character blocks. */
        Map tmpMap = new HashMap();
        tmpMap.put( DigitRep.ZERO.toString(),   "0");
        tmpMap.put( DigitRep.ONE.toString(),    "1");
        tmpMap.put( DigitRep.TWO.toString(),    "2");
        tmpMap.put( DigitRep.THREE.toString(),  "3");
        tmpMap.put( DigitRep.FOUR.toString(),   "4");
        tmpMap.put( DigitRep.FIVE.toString(),   "5");
        tmpMap.put( DigitRep.SIX.toString(),    "6");
        tmpMap.put( DigitRep.SEVEN.toString(),  "7");
        tmpMap.put( DigitRep.EIGHT.toString(),  "8");
        tmpMap.put( DigitRep.NINE.toString(),   "9");       
        VALID_DIGITS = Collections.unmodifiableMap(tmpMap);
    }

    /**
     * Private constructor to enforce flyweight/factory pattern.
     * 
     * @param blockRep
     */
    private Digit(String blockRep) {
        this.blockRep = blockRep;
    }

    /**
     * Flyweight factory method to create a Digit object from the "block"
     * representation of the digit.
     * @param blockRep The "block" representation of a digit.  Should look
     * something like:
     * " _ \n"
     * "|_|\n"
     * "|_|"
     * @return A flyweight Digit object representing the digit.
     */
    public static synchronized Digit getDigit(String blockRep) {
        Digit digit = digits.get(blockRep);
        if(digit == null) {
            digit = new Digit(blockRep);
            digits.put(blockRep, digit);
        }

        return digit;
    }

    /**
     * Determines whether or not the digit is valid.
     * @return true if the digit is valid, else false.
     */
    public boolean isValid() {
        return VALID_DIGITS.containsKey(blockRep);
    }

    /**
     * Accessor method to get the block representation of this digit.
     * 
     * @return
     */
    public String getBlockRep() {
        return blockRep;
    }

    @Override
    public String toString() {
        return VALID_DIGITS.containsKey(blockRep) ? VALID_DIGITS.get(blockRep) : "?";
    }
}

1
কম পরিচিত তবে এখনও অবিশ্বাস্যভাবে দরকারী নিদর্শনগুলির মধ্যে একটি +1।
ম্যাটড্যাভি

2

মূল গ্যাং অফ ফোর প্যাটার্নগুলির বেশিরভাগ এখনও ব্যবহার করা হয়, তবে অন্যান্য জনপ্রিয় রয়েছে যা বইটিতে নেই।

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

ডিজাইন প্যাটার্নগুলির জন্য তিনটি দুর্দান্ত সংস্থান:

"প্রধান ফার্স্ট ডিজাইনের প্যাটার্নস" বই - পছন্দের ভাষা জাভা, তবে সমস্ত ভাষার সাথে প্রাসঙ্গিক। চৌকস ডিজাইন প্যাটার্নস - দুর্দান্ত এবং বিনামূল্যে। কোড নকশা নিদর্শন ব্যাখ্যা। PluralSight - ডিজাইনের প্যাটার্নস লাইব্রেরি - এইটি দেওয়া হয় তবে এটি তালিকায় অন্তর্ভুক্ত না করা খুব ভাল।


1

আচ্ছা আপনি যদি এসিই এর মতো সাধারণ লাইব্রেরি ব্যবহার করেন তবে আপনি যতটা ভাবেন তার চেয়ে বেশি ব্যবহার করবেন। আমি পর্যবেক্ষক / পর্যবেক্ষণযোগ্য ব্যাপকভাবে ব্যবহার করি :-)


1

আমি একজন বিল্ডারকে কমপক্ষে একবার ব্যবহার করেছি (একই রূপান্তর প্রক্রিয়া এইচটিএমএল বা এক্সেল আউটপুট তৈরি করতে পারে)।

আমি প্রায়শই টেম্পলেট পদ্ধতিটি ব্যবহার করি (জেডিবিসি-সম্পর্কিত কাজের জন্য, বা বিমূর্ত সুইং কন্ট্রোলারদের জন্য)।

একবার আমাকে ফর্ম-ভিত্তিক অ্যাপ্লিকেশনটিতে প্রচুর নতুন বৈশিষ্ট্য বিকাশ করতে হয়েছিল, যা গোলযোগ ছিল। আমি বিদ্যমান পদার্থকে স্টেট-প্যাটার্ন ভিত্তিক সমাধানটিতে রিফেক্টর করার পরে কেবল অগ্রগতি করতে পারি। (বেশ, বেশিরভাগ)

আমি প্রায়শই কমান্ডগুলি ব্যবহার করি (অ্যাকশনগুলি পরিবর্তন করুন) এবং পর্যবেক্ষকরাও।

একবার আমি সুইং ফর্মগুলির পরিবর্তনগুলি সনাক্ত করার জন্য মেমমেন্টো-জাতীয় সমাধান ব্যবহার করি। ফর্মটি তার রাজ্যটিকে সিরিয়ালিয়াল করবে যা আমি পূর্বের রাজ্যের সাথে (সমান ()) তুলনা করি।


1

আমি বিশ্বাস করি আমার ক্যারিয়ার থেকে তাদের বেশিরভাগই রয়েছে। আমি নিশ্চিত যে কেবলমাত্র আমিই ব্যবহার করি নি তা হ'ল যে অ্যাডাপ্টার প্যাটার্নটি বইটিতে একাধিক উত্তরাধিকারের সাথে প্রয়োগ করা হয়েছে কারণ আমি একাধিক উত্তরাধিকারের বড় ভক্ত নই।


1

আমি ডেকোরেটর পছন্দ করি। উল্লিখিত ব্যক্তিদের সাথে আমি যুক্ত করেছি কেবলমাত্র প্রক্সি।

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