ব্যবসায়ের ত্রুটি থেকে রক্ষা পেতে স্ট্যাটিক টাইপ চেকিং ব্যবহার করা


13

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

// java code
Adult a = new Adult();
a.setAge("Roger"); //static type checker would complain
a.setName(42); //and here too

তবে এটি আপনাকে বোকা ভুলগুলি থেকে আটকাতে পারে না:

Adult a = new Adult();
// obviously you've mixed up these fields, but type checker won't complain
a.setAge(150); // nobody's ever lived this old
a.setWeight(42); // a 42lb adult would have serious health issues

সমস্যাটি তখন আসে যখন আপনি স্পষ্টতই বিভিন্ন ধরণের তথ্যের প্রতিনিধিত্ব করতে একই ধরণের ব্যবহার করছেন। আমি ভাবছিলাম এটির একটি ভাল সমাধান Integerক্লাসটি প্রসারিত করা হবে , কেবল ব্যবসায়ের যুক্তি ত্রুটিগুলি রোধ করার জন্য, তবে কার্যকারিতা যুক্ত করবেন না। উদাহরণ স্বরূপ:

class Age extends Integer{};
class Pounds extends Integer{};

class Adult{
    ...
    public void setAge(Age age){..}
    public void setWeight(Pounds pounds){...}
}

Adult a = new Adult();
a.setAge(new Age(42));
a.setWeight(new Pounds(150));

এটি কি ভাল অনুশীলন হিসাবে বিবেচিত হয়? বা এই জাতীয় একটি সীমাবদ্ধ নকশা নিয়ে রাস্তায় অপ্রত্যাশিত ইঞ্জিনিয়ারিং সমস্যা আছে?


5
a.SetAge( new Age(150) )এখনও সংকলন করবে না ?
জন উ

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

3
আপনি যে বিষয়ে কথা বলছেন তা হ'ল ডিজাইনের দুর্দান্ত উপায়! দুঃখের বিষয়, জাভাতে এত আদিম টাইপ সিস্টেম রয়েছে যে সঠিকভাবে করা কঠিন। এমনকি যদি আপনি এটি করার চেষ্টা করেও এটির ফলশ্রুতি যেমন কম পারফরম্যান্স বা নিম্ন বিকাশকারী উত্পাদনশীলতার মতো হতে পারে।
ইউফোরিক

@ জনউউ হ্যাঁ আপনার উদাহরণটি এখনও সংকলিত হবে, তবে এটি সেই যুক্তির ব্যর্থতার একক পয়েন্ট। একবার আপনি আপনার new Age(...)অবজেক্টটি ঘোষণা করলে আপনি Weightঅন্য কোনও স্থানে ভেরিয়েবলকে ভুলভাবে এটি নির্ধারণ করতে পারবেন না । এটি এমন জায়গাগুলির সংখ্যা হ্রাস করে যেখানে ভুল হতে পারে।
জে-বব

উত্তর:


12

আপনি প্রয়োজনীয়ভাবে ইউনিট সিস্টেমের জন্য জিজ্ঞাসা করছেন (না, ইউনিট পরীক্ষা নয়, "ইউনিট" যেমন "ফিজিকাল ইউনিট" যেমন মিটার, ভোল্ট ইত্যাদি)।

আপনার কোডে Ageসময়কে Poundsউপস্থাপন করে এবং ভরকে উপস্থাপন করে। এটি ইউনিট রূপান্তর, বেস ইউনিট, যথার্থ ইত্যাদি ইত্যাদির দিকে নিয়ে যায় leads


জাভাতে এমন জিনিস পাওয়ার চেষ্টা ছিল / আছে, উদাহরণস্বরূপ:

পরে দুটি মনে হয় এই গিথুব জিনিসটিতে বাস করছে: https://github.com/unitsofmeasurement


সি ++ এর বুস্টের মাধ্যমে ইউনিট রয়েছে


ল্যাবভিউ একচেটিয়া ইউনিট নিয়ে আসে ।


অন্যান্য ভাষায় অন্যান্য উদাহরণ রয়েছে। (সম্পাদনাগুলি স্বাগত)


এটি কি ভাল অনুশীলন হিসাবে বিবেচিত হয়?

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

তবে যে কোনও সাধারণ উদ্দেশ্যে উচ্চ স্তরের ভাষায়, যেখানে এত পরিমাণ কঠোরতার জন্য চাহিদা কম, এটি সম্ভবত অপ্রত্যাশিত।

বা এই জাতীয় একটি সীমাবদ্ধ নকশা নিয়ে রাস্তায় অপ্রত্যাশিত ইঞ্জিনিয়ারিং সমস্যা আছে?

আমার অনুমানটি হবে: পারফরম্যান্স / মেমরি। আপনি যদি অনেকগুলি মূল্যবোধ নিয়ে কাজ করেন, তবে মূল্য অনুসারে কোনও বস্তুর ওভারহেড একটি সমস্যা হয়ে উঠতে পারে । তবে সর্বদা হিসাবে: অকালীন অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল

আমি মনে করি যে বৃহত্তর "সমস্যা" লোকেরা এটির অভ্যস্ত হয়ে উঠছে, কারণ ইউনিটটি সাধারণত স্পষ্টভাবে এইভাবে সংজ্ঞায়িত হয়:

class Adult
{
    ...
    public void setAge(int ageInYears){..}

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


"লোকেরা যখন বিভ্রান্ত হয়ে পড়বে তখন তাদের এমন কোনও জিনিসের মূল্য হিসাবে একটি জিনিসকে পাস করতে হবে যা সম্ভবত একটি সাধারণ int..." - যার জন্য আমাদের এখানে সর্বনিম্ন আশ্চর্যের অধ্যক্ষটি এখানে গাইডেন্স হিসাবে রয়েছে। ভালো বল ধরা.
গ্রেগ বার্গার্ড্ট

1
আমি মনে করি কাস্টম রেঞ্জগুলি এটিকে একটি ইউনিট লাইব্রেরির ক্ষেত্র থেকে বাইরে এবং নির্ভরশীল প্রকারের মধ্যে নিয়ে যায়
জে।

6

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

আপনার যদি ইউনিটের জন্য কোনও প্রকারের সংজ্ঞা নির্ধারণের আরও দানাদার স্তরের প্রয়োজন হয় তবে উপকারী:

public struct Weight {
    private int pounds;
    private int ounces;

    public Weight(int pounds, int ounces) {
        // Value range checks go here
        // Throw exception if ounces is greater than 16?
    }

    // Getters go here
}

"বয়স" এর মতো কোনও কিছুর জন্য আমি গণনার পরামর্শ দিচ্ছি যে রান টাইমে ব্যক্তির জন্ম তারিখের ভিত্তিতে:

public class Adult {
    private Date birthDate;

    public Interval getCurrentAge() {
        return calculateAge(Date.now());
    }

    public Interval calculateAge(Date date) {
        // Return interval between birthDate and date
    }
}

2

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

কিছু ভাষা, যেমন স্কেলা সমর্থন করে ট্যাগগুলি সহজেই সমর্থন করে (উপরের লিঙ্কটি দেখুন)। অন্যদের মধ্যে, আপনি নিজের র্যাপার ক্লাস তৈরি করতে পারেন তবে এটি কম সুবিধাজনক।

বৈধতা, যেমন একজন ব্যক্তির উচ্চতা "যুক্তিসঙ্গত" তা পরীক্ষা করা অন্য সমস্যা another আপনি আপনার Adultক্লাসে (কনস্ট্রাক্টর বা সেটটার), বা আপনার ট্যাগযুক্ত প্রকার / মোড়ক ক্লাসের মধ্যে এই জাতীয় কোড রাখতে পারেন । একটি উপায়ে, অন্তর্নির্মিত ক্লাস যেমন যেমন ভূমিকা পালন করে URLবা UUIDপরিপূরণ করে (অন্যদের মধ্যে যেমন, ইউটিলিটি পদ্ধতি সরবরাহ করে)।

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

আমি যে কোডটি লিখছি তাতে আমি প্রায়শই মানচিত্রে পাস করি তবে প্রায়শই মোড়কের ক্লাস তৈরি করি। প্রকারগুলি যেমন Map<String, String>নিজেরাই খুব অস্বচ্ছ, তাই তাদের ক্লাসগুলিতে অর্থবহ নামের সাথে মোড়ানো যেমন NameToAddressঅনেক সাহায্য করে। অবশ্যই, ট্যাগযুক্ত প্রকারের সাথে আপনি লিখতে পারেন Map<Name, Address>এবং পুরো মানচিত্রের জন্য মোড়কের দরকার পড়ে না।

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

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