"ইও-ইও সমস্যাটি এড়ানো" "আদিম আবেগকে" অনুমোদনের একটি কার্যকর কারণ?


42

মতে কখন আদিম আবেগ একটি কোড গন্ধ হয় না? , স্ট্রিং অবজেক্টের পরিবর্তে একটি জিপ কোড উপস্থাপনের জন্য আমার একটি জিপকোড অবজেক্ট তৈরি করা উচিত।

তবে আমার অভিজ্ঞতায় আমি দেখতে পছন্দ করি prefer

public class Address{
    public String zipCode;
}

পরিবর্তে

public class Address{
    public ZipCode zipCode;
}

কারণ আমি মনে করি পরেরটিটির জন্য প্রোগ্রামটি বুঝতে আমার জিপকোড ক্লাসে যাওয়া দরকার।

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

সুতরাং আমি জিপকোড পদ্ধতিগুলি একটি নতুন শ্রেণিতে স্থানান্তর করতে চাই, উদাহরণস্বরূপ:

পুরানো:

public class ZipCode{
    public boolean validate(String zipCode){
    }
}

নতুন:

public class ZipCodeHelper{
    public static boolean validate(String zipCode){
    }
}

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

আমার প্রশ্ন হ'ল "ইও-ইও সমস্যাটি এড়ানো" (শ্রেণির সংজ্ঞাগুলির মধ্যে সরানো) "আদিম আবেগকে" অনুমোদনের একটি বৈধ কারণ?


9
@ jpmc26 তারপরে আপনি আমাদের জিপ কোড অবজেক্টটি কতটা জটিল তা দেখে হতবাক হয়ে যাবেন - এটি সঠিক নয় বলছেন, তবে এটি বিদ্যমান রয়েছে
জারেড গোগুয়েন

9
@ jpmc26, আপনি কীভাবে "জটিল" থেকে "খারাপভাবে ডিজাইন হয়েছেন" তা দেখতে আমি ব্যর্থ to কমপ্লেক্স কোডটি প্রায়শই সহজ কোডের ফলাফল যা আমরা আশা করতে পারি সেই আদর্শ বিশ্বের চেয়ে বরং বাস্তব বিশ্বের জটিলতার সংস্পর্শে আসে। "এই দুটি পৃষ্ঠার ফাংশনে ফিরে আসুন Yes হ্যাঁ, আমি জানি, একটি উইন্ডো প্রদর্শন করার জন্য এটি কেবল একটি সাধারণ ফাংশন, তবে এটিতে সামান্য চুল এবং স্টাফ বেড়েছে এবং কেন তা কেউ জানেনা Well ভাল, আমি আপনাকে বলব কেন: সেগুলি বাগ সংশোধন করা হয়েছে। "
ক্যারলেসা

18
@ jpmc26 - জিপকোডের মতো মোড়ানো বস্তুর পয়েন্ট হ'ল টাইপ সুরক্ষা। জিপ কোড কোনও স্ট্রিং নয়, এটি একটি জিপ কোড। যদি কোনও ফাংশনটি একটি জিপ কোডের প্রত্যাশা করে তবে আপনি কেবল একটি পিন কোড পাস করতে সক্ষম হবেন, স্ট্রিং নয়।
দ্রো

4
এটি অত্যন্ত ভাষা নির্দিষ্ট অনুভব করে, বিভিন্ন ভাষা এখানে বিভিন্ন জিনিস করে। @ ড্যাভেরুড্রালো একই প্রবন্ধে আমাদের প্রচুর সংখ্যক প্রকার যুক্ত করা উচিত। "শুধুমাত্র ধনাত্মক পূর্ণসংখ্যা", "কেবলমাত্র সংখ্যাসমূহ" সবই ধরণের হতে পারে।
পল 23

6
@ paul23 হঁ্যা, এবং প্রধান কারণ আমরা না ঐ আছে ভাষার অনেক তাদের সংজ্ঞায়িত করতে মার্জিত উপায়ে সমর্থন করি না হয়। "বয়স" কে "ডিগ্রি সেলসিয়াসে তাপমাত্রা" থেকে আলাদা ধরণের হিসাবে সংজ্ঞায়িত করা পুরোপুরি যুক্তিসঙ্গত, যদি কেবল "ইউজারএজ == কারেন্টটিম্পেরিটিক্স" বাজে হিসাবে চিহ্নিত হয়।
আইএমএসওপি

উত্তর:


116

ভাবনাটি হলো এই যে তুমি না ঠিকানার শ্রেণী বুঝতে পিনকোড ক্লাসে ইয়োইয়ো করা প্রয়োজন। যদি জিপকোডটি সুনিপুণভাবে ডিজাইন করা থাকে তবে এটি ঠিক ঠিকানা শ্রেণি পড়ে কী করে তা স্পষ্ট হওয়া উচিত।

প্রোগ্রামগুলি শেষ থেকে শেষ পর্যন্ত পড়া হয় না - সাধারণত এটি সম্ভব করার জন্য প্রোগ্রামগুলি খুব জটিল। আপনি কোনও প্রোগ্রামের সমস্ত কোড একই সাথে মনে রাখতে পারবেন না। সুতরাং আমরা প্রোগ্রামটিকে অর্থপূর্ণ ইউনিটগুলিতে "ছাঁটাই" করতে বিমূর্ততা এবং এনক্যাপসুলেশনগুলি ব্যবহার করি, সুতরাং আপনি প্রোগ্রামের একটি অংশ (ঠিকানা শ্রেণিটি বলুন) এর উপর নির্ভর করে সমস্ত কোড না পড়েই দেখতে পারেন।

উদাহরণস্বরূপ আমি নিশ্চিত যে আপনি যখনই স্ট্রিং-এর কোডিংয়ের মুখোমুখি হন তখনই স্ট্রিংয়ের উত্স কোডটি পড়ার ক্ষেত্রে আপনি যো-যো না।

ক্লাসটির নামকরণ জিপকোড থেকে জিপকোডহেল্পারে করার পরামর্শ দেয় এখন দুটি পৃথক ধারণা আছে: একটি জিপ কোড এবং একটি জিপ কোড সহায়ক। জটিল হিসাবে দ্বিগুণ। এবং এখন টাইপ সিস্টেম আপনাকে একটি স্বেচ্ছাসেবী স্ট্রিং এবং একটি বৈধ পিন কোডের মধ্যে পার্থক্য করতে সহায়তা করতে পারে না কারণ তাদের ধরণের একই ধরণ রয়েছে। এখানেই "আবেশ" উপযুক্ত: আপনি কোনও আদিমকে ঘিরে একটি সাধারণ মোড়কের প্রকার এড়াতে চান বলে আপনি আরও জটিল এবং কম নিরাপদ বিকল্পের পরামর্শ দিচ্ছেন।

এই বিশেষ ধরণের উপর নির্ভর করে কোনও বৈধতা বা অন্যান্য যুক্তি নেই এমন ক্ষেত্রে আইএমএইচও সমর্থনযোগ্য im তবে আপনি যে কোনও যুক্তি যুক্ত করার সাথে সাথে এই যুক্তিটি প্রকারের সাথে সংযুক্ত করে রাখলে এটি অনেক সহজ।

সিরিয়ালাইজেশন হিসাবে আমি মনে করি এটি আপনার ব্যবহৃত ফ্রেমওয়ার্কটিতে সীমাবদ্ধতার মতো মনে হচ্ছে like অবশ্যই আপনার একটি জিপকোডকে স্ট্রিংয়ে ক্রমিক করতে বা এটি একটি ডাটাবেসের কলামে মানচিত্র করতে সক্ষম হওয়া উচিত।


2
আমি "অর্থবহ ইউনিট" (মূল-) অংশের সাথে একমত, তবে এতটা নয় যে একটি জিপ কোড এবং পিন কোডের বৈধতা একই ধারণা। ZipCodeHelper(যা আমি বরং বলি ZipCodeValidator) এটির কাজটি করার জন্য খুব ভাল ওয়েব সার্ভিসে একটি সংযোগ স্থাপন করতে পারে। এটি "জিপ কোড ডেটা ধরে রাখুন" একক দায়বদ্ধতার অংশ হবে না । টাইপ সিস্টেমটিকে অবৈধ পিন কোডগুলি অস্বীকার করা এখনও ZipCodeকনস্ট্রাক্টরকে জাভা প্যাকেজ-প্রাইভেটের সমতুল্য করে এবং ZipCodeFactoryসর্বদা যাচাইকারীকে কল করে এটি কল করে অর্জন করা যায়।
আর স্মিটজ

16
@ আর। স্কিমেটজ: একক দায়িত্ব নীতি অর্থে "দায়বদ্ধতা" এর অর্থ এটি নয়। তবে যে কোনও ক্ষেত্রে, আপনি অবশ্যই জিপ কোড এবং এর বৈধতা আবশ্যকভাবে আপনার যতটা ক্লাস প্রয়োজন ততক্ষণ ব্যবহার করা উচিত। ওপিকে জিপ কোডটি এনক্যাপসুলেট করার পরিবর্তে কোনও সহায়ককে পরামর্শ দেওয়া হয়েছে , এটি একটি খারাপ ধারণা।
জ্যাকবিবি

1
আমি শ্রদ্ধার সাথে একমত হতে চাই এসআরপি অর্থাত একটি শ্রেণীর "একটি, এবং শুধুমাত্র একটি, পরিবর্তনের কারণ" হওয়া উচিত (একটি পিনকোড "বনাম" এটি কীভাবে বৈধ হয় "কীভাবে পরিবর্তিত হয়") তে পরিবর্তন হওয়া উচিত। এখানে এই নির্দিষ্ট ঘটনাতে আরও বইয়ে উপর বিস্তারিত হয় ক্লিন কোড : " অবজেক্টস বিমূর্ত পিছনে তাদের তথ্য গোপন এবং ফাংশন যে ডেটা পরিচালনা এক্সপোজ ডাটা স্ট্রাকচার তাদের তথ্য এক্সপোজ এবং কোন অর্থপূর্ণ ফাংশন আছে।। " - ZipCodeএকটি "ডাটা স্ট্রাকচার" হবে এবং ZipCodeHelper। একটি "অবজেক্টকে অবশ্যই 'যাই হোক, আমি মনে করি আমরা সম্মত হন যে আমরা পিনকোড কন্সট্রাকটর ওয়েব সংযোগ পাস করতে হবে করা উচিত নয়।
আর Schmitz

9
এই বিশেষ ধরণের উপর নির্ভর করে কোনও বৈধতা বা অন্যান্য যুক্তি নেই এমন ক্ষেত্রে আইএমএইচও সমর্থনযোগ্য im => আমি একমত নই এমনকি যদি সমস্ত মান বৈধ হয় তবে আমি আদিম ব্যবহারের পরিবর্তে ভাষাতে শব্দার্থবিজ্ঞানের কথা জানাতে চাই would যদি কোনও ক্রিয়াকলাপকে কোনও আদিম ধরণের কাছে ডাকা যেতে পারে যা এটির বর্তমান শব্দার্থক ব্যবহারের জন্য অযৌক্তিক, তবে এটি কোনও আদিম ধরণের হওয়া উচিত নয়, এটি কেবলমাত্র সংজ্ঞাগত ফাংশনগুলির সংজ্ঞায়িত সহ একটি সঠিক প্রকারের হওয়া উচিত। (উদাহরণস্বরূপ, intআইডি হিসাবে ব্যবহারের ফলে একটি আইডি দ্বারা কোনও আইডি গুণ করা যায় ...)
ম্যাথিউ এম।

@ আর.স্কিটজি আমার মনে হয় যে আপনি যে পার্থক্য করছেন তার জন্য জিপ কোডগুলি একটি দুর্বল উদাহরণ। এমন কিছু পরিবর্তন হয় যা প্রায়শই পৃথক Fooএবং FooValidatorক্লাসের প্রার্থী হতে পারে । আমাদের কাছে এমন একটি ZipCodeশ্রেণি থাকতে পারে যা ফর্ম্যাটটিকে বৈধ করে এবং এমন একটি ZipCodeValidatorওয়েব সার্ভিসকে হিট করে যা সঠিকভাবে ফর্ম্যাট করে ZipCodeতা আসলে বর্তমান কিনা তা পরীক্ষা করতে । আমরা জানি যে জিপ কোডগুলি পরিবর্তন হয়। তবে ব্যবহারিকভাবে, আমরা বৈধ পিন কোডগুলির একটি এনপ্যাপুলেটেড ZipCodeবা একটি স্থানীয় স্থানীয় ডাটাবেসে একটি তালিকা রাখতে চাই ।
নেই

55

যদি করতে পারেন:

new ZipCode("totally invalid zip code");

এবং জিপকোডের কনস্ট্রাক্টর তা করে:

ZipCodeHelper.validate("totally invalid zip code");

তারপরে আপনি এনক্যাপসুলেশনটি ভেঙে ফেলেছেন এবং জিপকোড শ্রেণিতে একটি দুর্দান্ত নির্বিকার নির্ভরতা যুক্ত করেছেন। যদি কনস্ট্রাক্টর কল না করেZipCodeHelper.validate(...) তবে আপনার নিজের দ্বীপে বাস্তবে তা প্রয়োগ না করে বিচ্ছিন্ন যুক্তি রয়েছে। আপনি অবৈধ জিপ কোডগুলি তৈরি করতে পারেন।

validateপদ্ধতি পিনকোড বর্গ উপর একটি স্ট্যাটিক পদ্ধতি হতে হবে। এখন একটি "বৈধ" জিপ কোডের জ্ঞানটি জিপকোড শ্রেণীর সাথে একত্রিত হয়। আপনার কোড উদাহরণগুলি জাভার মতো দেখায়, জিপকোডের নির্মাতাকে যদি কোনও ভুল ফর্ম্যাট দেওয়া থাকে তবে তার ব্যতিক্রম অবশ্যই ছুঁড়ে ফেলা উচিত:

public class ZipCode {
    private String zipCode;

    public ZipCode(string zipCode) {
        if (!validate(zipCode))
            throw new IllegalFormatException("Invalid zip code");

        this.zipCode = zipCode;
    }

    public static bool validate(String zipCode) {
        // logic to check format
    }

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

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

জিপকোড শ্রেণীর এই রূপটিতে কোনও "ইয়ো-ইও" নেই। এটিকে কেবল যথাযথ অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং বলা হয়।


আমরা এখানে আন্তর্জাতিকীকরণকেও অগ্রাহ্য করতে যাচ্ছি, যার জন্য জিপকোডফর্ম্যাট বা ডাক্তেল সার্ভিস (উদাহরণস্বরূপ पोस्टलসোসর্স.আইভিলেডপোস্টালকোড (...), ডাকটেল সার্ভিস.পারসপোস্টালকোড (...) ইত্যাদি) নামে অন্য শ্রেণীর প্রয়োজন হতে পারে।


28
দ্রষ্টব্য: এখানে @ গ্রেগ বার্খার্ট্টের পদ্ধতির মূল সুবিধাটি হ'ল কেউ যদি আপনাকে একটি জিপকোড বস্তু দেয় তবে আপনি বিশ্বাস করতে পারেন যে এটিতে আবার পরীক্ষা না করেই এটি একটি বৈধ স্ট্রিং রয়েছে, কারণ এটির ধরণ এবং এটি সফলভাবে নির্মিত হয়েছিল আপনাকে দেয় gives গ্যারান্টি আপনি যদি তার পরিবর্তে স্ট্রিংগুলি পাশ দিয়ে যান তবে আপনার বৈধ পিন কোড রয়েছে কিনা তা নিশ্চিত হওয়ার জন্য আপনার কোডের বিভিন্ন স্থানে "ভেরিয়েট (জিপকোড)" লাগানোর প্রয়োজন মনে হতে পারে তবে সফলভাবে নির্মিত জিপকোড অবজেক্টের সাহায্যে আপনি বিশ্বাস করতে পারেন এর সামগ্রীগুলি আবার পরীক্ষা না করে বৈধ।
কিছু লোক

3
@ আর। স্কিমেটজ: ZipCode.validateপদ্ধতিটি এমন একটি প্রাক-চেক যা কোনও ব্যতিক্রম ছুঁড়ে এমন কোনও কনস্ট্রাক্টরকে ডাকার আগে সম্পাদন করা যায়।
গ্রেগ বার্গার্ট

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

11
একটি ফ্যাক্টরি ফাংশন যা ptionচ্ছিক <জিপকোড> ফেরত দেয় এটিও একটি সম্ভাবনা। তারপরে কলকারীর কারখানার কার্যকারিতাটির সম্ভাব্য ব্যর্থতা স্পষ্টভাবে পরিচালনা করা ছাড়া কোনও উপায় নেই। নির্বিশেষে, উভয় ক্ষেত্রেই, ত্রুটিটি সম্ভবত সমস্যা থেকে ক্লায়েন্ট কোড দ্বারা মূল সমস্যা থেকে দূরে স্রষ্টার পরিবর্তে এটি তৈরি করা হয়েছিল তার কাছাকাছি কোথাও আবিষ্কার করা হবে।
কিছু লোক

6
আপনি জিপকোডকে নির্লিপ্তভাবে বৈধ করতে পারবেন না, তাই করবেন না। জিপকোড / পোস্টকোড বৈধতা নিয়মগুলি সন্ধান করার জন্য আপনার সত্যিকারের দেশের অবজেক্টের প্রয়োজন।
জোশুয়া

11

আপনি যদি এই প্রশ্নটি নিয়ে অনেক কুস্তি দেখান, সম্ভবত আপনি যে ভাষাটি ব্যবহার করেন তা কাজটির সঠিক সরঞ্জাম নয়? এই জাতীয় "ডোমেন-টাইপযুক্ত আদিম" তুচ্ছভাবে প্রকাশ করা সহজ, উদাহরণস্বরূপ, এফ #।

সেখানে আপনি উদাহরণস্বরূপ লিখতে পারেন:

type ZipCode = ZipCode of string
type Town = Town of string

type Adress = {
  zipCode: ZipCode
  town: Town
  //etc
}

let adress1 = {
  zipCode = ZipCode "90210"
  town = Town "Beverly Hills"
}

let faultyAdress = {
  zipCode = "12345"  // <-Compiler error
  town = adress1.zipCode // <- Compiler error
}

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


আকর্ষণীয় - আপনি যদি এর বৈধতা প্রয়োগ করতে চান তবে কেমন লাগবে ZipCode?
হাল্ক

4
@ হাল্ক আপনি এফ # তে ওও-স্টাইল লিখতে পারেন এবং প্রকারগুলিকে শ্রেণিতে পরিণত করতে পারেন। যাইহোক, আমি ক্রিয়ামূলক শৈলী পছন্দ করি, টাইপটি জিপকোড = স্ট্রিংয়ের ব্যক্তিগত জিপকোডের সাথে প্রকারটি ঘোষণা করে এবং একটি ক্রিয়া ফাংশন সহ একটি জিপকোড মডিউল যুক্ত করি adding এখানে কয়েকটি উদাহরণ রয়েছে: gist.github.com/swlaschin/54cfff886669ccab895a
গুরান

@ বেন্ট-ট্রানবার্গ সম্পাদনা করার জন্য ধন্যবাদ। আপনি ঠিক বলেছেন, একটি সাধারণ টাইপের সংক্ষিপ্তকরণ সংকলনের সময় প্রকারের সুরক্ষা দেয় না।
গুরান

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

হ্যাঁ। আমার আসল উত্সটি বৈধ ছিল, দুর্ভাগ্যক্রমে যে উদাহরণটি অবৈধ বলে সাব্যস্ত হয়েছিল including ডোহ! আমার নিজের কোড টাইপ করার পরিবর্তে কেবল ওলাশিনের সাথে সংযুক্ত হওয়া উচিত :) fsharpforfunandprofit.com/posts/…
গুরান

6

উত্তরটি সম্পূর্ণরূপে আপনি জিপ কোডগুলি দিয়ে কী করতে চান তার উপর নির্ভর করে। এখানে দুটি চরম সম্ভাবনা রয়েছে:

(1) সমস্ত ঠিকানা একক দেশে থাকার গ্যারান্টিযুক্ত। মোটেই ব্যতিক্রম নয়। (যেমন কোনও বিদেশী গ্রাহক নয়, বা কোনও বিদেশী গ্রাহকের জন্য কাজ করার সময় এমন কোনও কর্মী যার ব্যক্তিগত ঠিকানা বিদেশে নেই)) এই দেশে জিপ কোড রয়েছে এবং এগুলি কখনও গুরুতর সমস্যাযুক্ত হওয়ার আশা করা যায় না (অর্থাত্ তাদের ফ্রি-ফর্ম ইনপুট প্রয়োজন হয় না) যেমন "বর্তমানে ডি 4 বি 6 এন 2, তবে প্রতি 2 সপ্তাহে এটি পরিবর্তন হয়")। জিপ কোডগুলি কেবল সম্বোধনের জন্য নয়, অর্থ প্রদানের তথ্যের বৈধতা বা অনুরূপ উদ্দেশ্যে ব্যবহৃত হয়। - এই পরিস্থিতিতে, একটি জিপ কোড বর্গ অনেক বোঝায়।

(২) ঠিকানাগুলি প্রায় প্রতিটি দেশেই থাকতে পারে, তাই কয়েক হাজার বা শত শত ঠিকানা স্কিমগুলি জিপ কোড সহ (বা কয়েক হাজার অদ্ভুত ব্যতিক্রম এবং বিশেষ ক্ষেত্রে সহ) প্রাসঙ্গিক। একটি "জিপ" কোডটি সত্যই কেবল সেই দেশগুলির লোকদের মনে করিয়ে দেওয়ার জন্য জিজ্ঞাসা করা হয় যেখানে জিপ কোডগুলি তাদের সরবরাহ করতে ভুলে যেতে ভুলে যায় না। ঠিকানাগুলি কেবলমাত্র তাই ব্যবহার করা হয় যাতে কেউ যদি তাদের অ্যাকাউন্টে অ্যাক্সেস হারিয়ে ফেলে এবং তারা তাদের নাম এবং ঠিকানা প্রমাণ করতে পারে তবে অ্যাক্সেস পুনরুদ্ধার করা হবে। - এই পরিস্থিতিতে, সমস্ত প্রাসঙ্গিক দেশের জন্য জিপ কোড ক্লাস একটি বিশাল প্রচেষ্টা হবে। ভাগ্যক্রমে তাদের মোটেই প্রয়োজন হয় না।


3

অন্যান্য উত্তরগুলি ওও ডোমেন মডেলিং এবং আপনার মান উপস্থাপনের জন্য আরও সমৃদ্ধ ধরণের ব্যবহার সম্পর্কে কথা বলেছে।

আমি পোষন করি না, বিশেষত আপনি পোস্ট করেছেন উদাহরণ কোডটি দিয়ে।

তবে আমিও আশ্চর্য হই যে এটি যদি আপনার প্রশ্নের শিরোনামের উত্তর দেয় answers

নিম্নলিখিত দৃশ্যের বিষয়টি বিবেচনা করুন (আমি যে বাস্তব প্রকল্পটিতে কাজ করছি তা থেকে টানা):

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

এই দৃশ্যে, এসকিউএল রিজেক্স সীমাবদ্ধতা (বা এর ওআরএম সমতুল্য) সহ সন্নিবেশটিকে বৈধতা দেওয়ার বাইরে অনেক কিছু করা সম্ভবত YAGNI জাতের ওভারকিল।


6
আপনার এসকিউএল রেজেক্স সীমাবদ্ধতা একটি যোগ্য প্রকার হিসাবে দেখা যেতে পারে - আপনার ডাটাবেসের মধ্যে জিপ কোডটি "ভারচর" হিসাবে সংরক্ষণ করা হয় না তবে "এই নিয়মটির দ্বারা ভারচর বাঁধা"। কিছু ডিবিএমএসে আপনি সহজেই সেই ধরণের + বাধাটিকে পুনরায় ব্যবহারযোগ্য "ডোমেন টাইপ" হিসাবে একটি নাম দিতে পারেন, এবং আমরা ডেটাটিকে অর্থবহ প্রকার দেওয়ার প্রস্তাবিত জায়গায় ফিরে এসেছি। আমি নীতিগতভাবে আপনার উত্তরের সাথে একমত, তবে মনে করি না যে উদাহরণটি মেলে; আপনার ডেটা যদি "কাঁচা সেন্সর ডেটা" হয় তবে এর চেয়ে ভাল উদাহরণ হ'ল, এবং সর্বাধিক অর্থপূর্ণ ধরণটি "বাইট অ্যারে" কারণ ডেটাটির অর্থ কী তা আপনার কোনও ধারণা নেই।
আইএমএসওপি

@ আইএমএসওপি আকর্ষণীয় পয়েন্ট। যদিও আমি একমত তা নিশ্চিত নই: আপনি জাভাতে (বা অন্য কোনও ভাষায়) একটি স্ট্রিং জিপ কোডটি একটি রেইজেক্সের সাথে বৈধতা দিতে পারেন তবে আরও ধনী প্রকারের পরিবর্তে স্ট্রিং হিসাবে এটি ব্যবহার করছেন। ডোমেন যুক্তির উপর নির্ভর করে আরও কারসাজির প্রয়োজন হতে পারে (উদাহরণস্বরূপ এটি নিশ্চিত করা যে জিপ কোডটি রাজ্যের সাথে মেলে, এমন কিছু যা রেজেক্সের সাথে যাচাই করা কঠিন / অসম্ভব)।
জারেড স্মিথ

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

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

1

ZipCodeবিমূর্ততা কেবল তখনই বোঝাতে পারে যদি আপনার Addressশ্রেণীর কোনও TownNameসম্পত্তি না থাকে। অন্যথায়, আপনার অর্ধ বিমূর্ততা রয়েছে: জিপ কোডটি শহরকে মনোনীত করে, তবে এই দুটি সম্পর্কিত বিট বিভিন্ন শ্রেণিতে পাওয়া যায়। এটি বেশ অর্থপূর্ণ নয়।

তবে, তবুও, এটি এখনও আদিম আবেশের সঠিক প্রয়োগ নয় (বা এর পরিবর্তে সমাধান); যা আমি বুঝতে পেরেছি, মূলত দুটি বিষয়কে কেন্দ্র করে:

  1. কোনও পদ্ধতির ইনপুট (বা এমনকি আউটপুট) মান হিসাবে আদিম ব্যবহার করা, বিশেষত যখন আদিম সংগ্রহের প্রয়োজন হয়।
  2. এইগুলির মধ্যে কয়েকটিকে তাদের নিজস্ব সাবক্লাসে শ্রেণিবদ্ধ করা উচিত কিনা তা পুনর্বিবেচনা না করে যে সময়ের সাথে অতিরিক্ত বৈশিষ্ট্যগুলি বাড়ায় lasses

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

এইভাবে আপনি কীভাবে জানেন যে আপনার আর কোনও উপ- Addressবিভাগের দরকার নেই: এটিকে আরও ভেঙে ফেলা শ্রেণীর কার্যকরী উদ্দেশ্য থেকে বিরত থাকবে । একইভাবে, ক্লাসে Nameআপনার কোনও সাবক্লাস ব্যবহার করার প্রয়োজন নেই Person, যদি না Name(সংযুক্ত ব্যক্তি ব্যতীত) আপনার ডোমেনে অর্থবোধক ধারণা না থাকে। যা এটি (সাধারণত) হয় না। নামগুলি মানুষ সনাক্ত করতে ব্যবহার করা হয়, সাধারণত তাদের নিজস্ব কোনও মূল্য থাকে না।


1
@ রিকডি: উত্তর থেকে: " ক্লাসে Nameআপনার কোনও সাবক্লাস ব্যবহার করার দরকার নেই Person, যদি না নাম (সংযুক্ত ব্যক্তি ব্যতীত) আপনার ডোমেইনে অর্থবহ ধারণা না থাকে ।" যখন আপনার নামগুলির জন্য কাস্টম বৈধতা রয়েছে, তখন নামটি আপনার ডোমেনে অর্থবহ ধারণা হয়ে দাঁড়িয়েছে; যা আমি স্পষ্টভাবে উপ-প্রকারটি ব্যবহারের জন্য একটি বৈধ ব্যবহারের কেস হিসাবে উল্লেখ করেছি। দ্বিতীয়ত, পিনকোড যাচাইকরণের জন্য, আপনি অতিরিক্ত অনুমানগুলি চালু করছেন যেমন কোনও জিপ কোডগুলি প্রদত্ত দেশের ফর্ম্যাটটি অনুসরণ করার জন্য প্রয়োজনীয়। আপনি এমন একটি বিষয় নিয়ে যাচ্ছেন যা ওপির প্রশ্নের অভিপ্রায়টির চেয়ে অনেক বিস্তৃত।
ফ্ল্যাটার

5
" একটি ঠিকানা হ'ল সুস্পষ্টভাবে প্রয়োজনীয় সংজ্ঞা (রাস্তা, নম্বর, জিপ, শহর, রাজ্য, দেশ) সহ একটি সংজ্ঞায়িত ধারণা " "- ঠিক এটি কেবল সাধারণ ভুল। এটি মোকাবেলার জন্য ভাল উপায়ের জন্য, অ্যামাজনের ঠিকানা ফর্মটি দেখুন।
আর স্মিটজ

4
@ ফ্ল্যাটার ওয়েল মিথ্যাচারের পুরো তালিকাটি না পড়ার জন্য আমি আপনাকে দোষ দেব না, কারণ এটি বেশ দীর্ঘ, তবে এটিতে আক্ষরিক অর্থে "ঠিকানাগুলি একটি রাস্তায় থাকবে", "একটি ঠিকানাতে একটি শহর এবং একটি দেশ উভয়ই প্রয়োজন", "একটি ঠিকানা একটি পোস্টকোড থাকবে "ইত্যাদি, যা উদ্ধৃত বাক্যটি বলে তার বিপরীত।
আর স্মিটজ

8
@ গ্রেগবার্গার্ড্ট "জিপ কোড মার্কিন যুক্তরাষ্ট্রের ডাক পরিষেবা গ্রহণ করে, এবং আপনি জিপ কোড থেকে শহরের নামটি পেতে পারেন Cities শহরে একাধিক জিপ কোড থাকতে পারে তবে প্রতিটি পিন কোড কেবল একটি শহরে আবদ্ধ।" এটি সাধারণভাবে সঠিক নয়। আমার কাছে একটি জিপকোড রয়েছে যা মূলত একটি প্রতিবেশী শহরের জন্য ব্যবহৃত হয় তবে আমার বাসস্থান সেখানে অবস্থিত নয়। জিপকডগুলি সর্বদা সরকারী সীমানার সাথে সারিবদ্ধ হয় না। উদাহরণস্বরূপ, 42223 টিএন এবং কেওয়াই উভয় থেকে কাউন্টি রয়েছে ।
জিমি জেমস

2
অস্ট্রিয়াতে এমন একটি উপত্যকা রয়েছে যা কেবল জার্মানি থেকে প্রবেশযোগ্য ( en.wikedia.org/wiki/Kleinwalsertal )। এই অঞ্চলের জন্য একটি বিশেষ চুক্তি বিদ্যমান রয়েছে যা অন্যান্য বিষয়ের সাথে এই অঞ্চলের ঠিকানাগুলিতে অস্ট্রিয়ান এবং জার্মান উভয় পোস্ট কোড রয়েছে। সুতরাং সাধারণভাবে, আপনি এমনকি ধরেও নিতে পারবেন না যে ঠিকানায় একটি ঠিক বৈধ ডাক কোড রয়েছে;)
হাল্ক

1

নিবন্ধ থেকে:

আরও সাধারণভাবে, ইয়ো-ই সমস্যাটি এমন কোনও পরিস্থিতি সম্পর্কেও উল্লেখ করতে পারে যেখানে একটি ধারণা বোঝার জন্য কোনও ব্যক্তিকে অবশ্যই বিভিন্ন তথ্যের উত্সগুলির মধ্যে ফ্লিপিং রাখতে হবে।

উত্স কোডটি লিখিত হওয়ার চেয়ে অনেক বেশিবার পড়া হয়। সুতরাং, অনেক ফাইলের মধ্যে স্যুইচ করার ইও-ইও সমস্যাটি উদ্বেগজনক।

তবে না , গভীরভাবে আন্তঃনির্ভরশীল মডিউল বা ক্লাসগুলি (যা একে অপরের মধ্যে পিছনে পিছনে ডাকে) ডিল করার সময় ইয়ো-ইও সমস্যা আরও বেশি প্রাসঙ্গিক বোধ করে। এগুলি পড়ার জন্য একটি বিশেষ ধরণের দুঃস্বপ্ন এবং সম্ভবত ইয়ো-ই সমস্যাটির মুদ্রকটি মনে রেখেছিল।

তবে - হ্যাঁ , বিমূর্ততার অনেকগুলি স্তর এড়ানো গুরুত্বপূর্ণ!

সমস্ত অ-তুচ্ছ বিমূর্ততা কিছুটা হলেও ফাঁস হয়। - লিকি বিমূর্তনের আইন।

উদাহরণস্বরূপ, আমি তৈরি ধৃষ্টতা সঙ্গে মতানৈক্য mmmaaa এর উত্তর যে "আপনি না [(দর্শন)] পিনকোড ঠিকানা বর্গ বুঝতে ক্লাসে ইয়োইয়ো প্রয়োজন"। আমার অভিজ্ঞতা হয়েছে যে আপনার কি - অন্তত প্রথম কয়েক বার আপনি কোড পড়া। যাইহোক, অন্যরা যেমন উল্লেখ করেছে যে, অনেক সময় এমন সময় আসে যখন কোনও ZipCodeশ্রেণি উপযুক্ত হয়।

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

আমি ব্যক্তিগতভাবে "কোডের রেখাগুলি সংরক্ষণ" (এবং অবশ্যই সম্পর্কিত "ফাইলগুলি / মডিউলগুলি / ক্লাসগুলি সংরক্ষণ করুন" ইত্যাদি) লক্ষ্য করি। আমি আত্মবিশ্বাসী এমন কেউ কেউ আছেন যারা আমার কাছে "আদিম উন্মাদিত" এর উপমাটি প্রয়োগ করবেন - আমি লেবেল, নিদর্শন এবং বিরোধী নিদর্শন সম্পর্কে চিন্তা করার চেয়ে যুক্তিযুক্ত কারণগুলির পক্ষে কোড থাকা আরও গুরুত্বপূর্ণ মনে করি । কোন ফাংশন, একটি মডিউল / ফাইল / শ্রেণি তৈরি করতে বা কোনও সাধারণ স্থানে কোনও ফাংশন স্থাপন করার সঠিক পছন্দটি খুব পরিস্থিতিগত। আমি প্রায় 3-100 লাইন ফাংশন, 80-500 লাইন ফাইল এবং পুনরায় ব্যবহারযোগ্য লাইব্রেরি কোডের জন্য "1, 2, এন" লক্ষ্য করি ( এসএলওসি - মন্তব্য বা বয়লারপ্লেট সহ নয়; আমি সাধারণত বাধ্যতামূলক প্রতি লাইনে কমপক্ষে 1 টি অতিরিক্ত এসএলওসি ন্যূনতম চাই boilerplate,)।

বিকাশকারীদের ঠিক এমনটি করার পরে বেশিরভাগ ইতিবাচক নিদর্শন তৈরি হয়েছিল, যখন তাদের প্রয়োজন হয়েছিল । একই সমস্যা সমাধান না করে প্যাটার্ন প্রয়োগ করার চেষ্টা করার চেয়ে পাঠযোগ্য কোড কীভাবে লিখতে হবে তা শিখতে আরও অনেক গুরুত্বপূর্ণ। যে কোনও ভাল বিকাশকারী কারখানার প্যাটার্নটি অসাধারণ ক্ষেত্রে আগে না দেখে এটি প্রয়োগ করতে পারে যেখানে এটি তাদের সমস্যার জন্য উপযুক্ত। আমি কারখানার প্যাটার্ন, পর্যবেক্ষক প্যাটার্ন এবং সম্ভবত কয়েক শতাধিক ব্যবহার করেছি, তাদের নাম না জেনে (অর্থাত্ সেখানে "ভেরিয়েবল অ্যাসাইনমেন্ট প্যাটার্ন" আছে?)। একটি মজাদার পরীক্ষার জন্য - দেখুন জেএস ভাষায় কতগুলি জিওএফ নিদর্শন তৈরি করা হয়েছে - 2009 সালে প্রায় 12-15 পরে আমি গণনা বন্ধ করে দিয়েছি The কারখানার প্যাটার্নটি জেএস কনস্ট্রাক্টরের কাছ থেকে কোনও জিনিস ফেরত দেওয়ার মতোই সহজ, উদাহরণস্বরূপ - প্রয়োজন নেই একটি উইজেটফ্যাক্টরি।

সুতরাং - হ্যাঁ , কখনও কখনও ZipCode একটি ভাল বর্গ হয়। তবে, না , ইয়ো-ইও সমস্যাটি কঠোরভাবে প্রাসঙ্গিক নয়।


0

ইয়ো-ইও সমস্যাটি কেবল তখনই প্রাসঙ্গিক যদি আপনার পিছনে পিছনে পিছনে যেতে হয়। এটি এক বা দুটি জিনিস দ্বারা সৃষ্ট হয় (কখনও কখনও উভয়):

  1. খারাপ নামকরণ। জিপকোডটি ঠিক আছে বলে মনে হচ্ছে, জোনমিম্প্রুমেন্ট প্ল্যানকোডের বেশিরভাগ লোকের (এবং এমন কয়েকজন যা মুগ্ধ হবে না) তার জন্য একটি চেহারা প্রয়োজন।
  2. অনুপযুক্ত মিলন। বলুন আপনি জিপকোড শ্রেণিতে একটি এরিয়া কোড লুক রয়েছে। আপনি মনে করতে পারেন এটি কার্যকর হয়েছে কারণ এটি সুবিধাজনক, তবে এটি আসলেই জিপকোডের সাথে সম্পর্কিত নয় এবং এটি জুতা দেওয়ার অর্থ এই যে এখন মানুষ জানেন না যে জিনিসগুলি কোথায় যাওয়া উচিত।

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


-1

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

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