আমার মান পরীক্ষক ফাংশনটির জন্য একটি বুলিয়ান এবং একটি বার্তা উভয়ই ফিরিয়ে দেওয়া দরকার


14

আমার একটি মান পরীক্ষণ ফাংশন রয়েছে, অনেকটা ক্রেডিট কার্ড নম্বর যাচাইয়ের মতো, যা স্ট্রিংয়ে পাস হয় এবং মানটি সঠিক বিন্যাসের কিনা তা পরীক্ষা করা দরকার।

যদি এটি সঠিক ফর্ম্যাট হয় তবে এটি সত্য হতে পারে।

যদি এটি সঠিক ফর্ম্যাট না হয় তবে এটি মিথ্যা ফিরতে হবে এবং মানটির মধ্যে কী আছে তাও আমাদের জানান।

প্রশ্নটি হল, এটি অর্জনের সর্বোত্তম উপায় কী?

কয়েকটি সমাধান এখানে:

1. অর্থ বোঝাতে পূর্ণসংখ্যার / এনাম রিটার্ন কোডগুলি ব্যবহার করুন:

String[] returnCodeLookup = 
[
"Value contains wrong number of characters, should contain 10 characters",
"Value should end with 1", 
"Value should be a multiple of 3"
]

private int valueChecker(String value)
{
    /*check value*/
    return returnCode;
}

rc = checkValue(valueToBeChecked);
if rc == 0
{
    /*continue as normal*/
}
else
{
    print("Invalid value format: ") + returnCodeLookup[rc];
}

আমি এই সমাধানটি পছন্দ করি না কারণ এটির কলারের পক্ষে এটি প্রয়োগ করা প্রয়োজন।

২. রিটার্নকোড ক্লাস তৈরি করুন

Class ReturnCode()
{
    private boolean success;
    private String message;

    public boolean getSuccess()
    {
        return this.success;
    }

    public String getMessage()
    {
        return this.message; 
    }
}

private ReturnCode valueChecker(String value)
{
    /*check value*/
    return returnCode;
}

rc = checkValue(valueToBeChecked);
if rc.getSuccess()
{
    /*continue as normal*/
}
else
{
    print("Invalid value format: ") + rc.getMessage();
}

এই সমাধানটি পরিপাটি, তবে মনে হয় ওভারকিল / চাকাটি পুনর্বহাল করা।

৩. ব্যতিক্রম ব্যবহার করুন।

private boolean valueChecker(String value)
{
    if int(value)%3 != 0 throw InvalidFormatException("Value should be a multiple of 3";
    /*etc*/
    return True;
}

try {
rc = checkValue(valueToBeChecked);
}

catch (InvalidFormatException e)
{
     print e.toString();
}

আমি এই সমাধানটি ব্যবহার করার জন্য প্রলুব্ধ হয়েছি, তবে আমাকে বলা হয়েছে যে আপনার ব্যবসার যুক্তির জন্য ব্যতিক্রম ব্যবহার করা উচিত নয়।


'[..] পরীক্ষা করুন যে মানটি সঠিক বিন্যাসে রয়েছে' ' নামটি তখন ফর্ম্যাটচেকার হওয়া উচিত নয় ?
অ্যান্ডি

সত্য / মিথ্যা ফলাফল অপ্রয়োজনীয় বলে মনে হচ্ছে। সাফল্য ইঙ্গিত করার জন্য এটি কি খালি বা নাল স্ট্রিংটি সহজেই ফিরিয়ে দিতে পারে? এটি প্রায় 50 বছর ধরে ইউনিক্সের জন্য কাজ করেছে। :-)
user949300

উত্তর:


14

আরও জটিল রিটার্ন অবজেক্ট ব্যবহার করুন যা উভয় উদ্বেগকে ঘিরে রেখেছে। উদাহরণ:

public interface IValidationResult {
  boolean isSuccess();
  String getMessage();
}

এর বিভিন্ন সুবিধা রয়েছে:

  1. এক অবজেক্টে একাধিক সম্পর্কিত ডেটা টুকরো দেয়।
  2. ভবিষ্যতে আপনার অতিরিক্ত ডেটা যুক্ত করতে চাইলে সম্প্রসারণের ঘর।
  3. টেম্পোরাল কাপলিংয়ের উপর নির্ভরতা রাখবেন না: আপনি একাধিক ইনপুটকে বৈধতা দিতে পারেন এবং তারা অন্য উত্তরের মতো বার্তাটি আঁকিয়ে রাখে না। আপনি কোনও থ্রেডে এমনকি কোনও ক্রমে বার্তাগুলি চেক করতে পারেন।

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


আমার অবশ্যই এই সমাধানটি আমার চেয়ে ভাল mit খনি থ্রেডসেফ নয়।
তুলাইনস কর্ডোভা

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

একটি ইন্টারফেস কেন প্রয়োজনীয়?
dwjohnston

1
@ ডিডজোহনস্টন একটি ইন্টারফেসের প্রয়োজন হয় না, তবে এটি একটি ভাল ধারণা। উত্তরাধিকার হ'ল একটি অত্যন্ত শক্তিশালী ধরণের সংযোগ যা কেবল যখন প্রয়োজন হয় তখনই ব্যবহার করা উচিত।

পর্যায়ক্রমে, আপনি আরও সহজ করতে পারেন। সাফল্য আকর্ষণীয় নয়, সুতরাং একটি ধ্রুবক ঘোষণা করুন IValidationResult.SUCCESSযা খালি ত্রুটির বার্তা দেয়। তারপরে আপনার যুক্তিটি দেখে মনে হচ্ছেif (result != SUCCESS) { doStuff(result.getMessage()); }
মরগেন

2

উপরের কোনওটিই, একটি ভ্যালু চেকার ক্লাস ব্যবহার করবেন না

আপনাকে নমনীয়তা দেওয়ার জন্য প্রথমে একটি ইন্টারফেস:

public interface IValueChecker {
    public boolean checkValue(String value);
    public String getLastMessage();
}

তারপরে আপনার প্রয়োজন অনুযায়ী অনেক ভ্যালুচেকারগুলি প্রয়োগ করুন:

public class MyVeryEspecificValueChecker implements IValueChecker {
    private String lastMessage="";
    @Override
    public boolean checkValue(String value) {
        boolean valid=false;
        // perform check, updates "valid" and "lastMessage"
        return valid;
    }
    @Override
    public String getLastMessage() {
        return lastMessage;
    }
}

নমুনা ক্লায়েন্ট কোড:

public class TestValueChecker {
    public static void main(String[] args) {
        String valueToCheck="213123-YUYAS-27163-10";
        IValueChecker vc = new MyVeryEspecificValueChecker();
        vc.checkValue(valueToCheck);
        System.out.println(vc.getLastMessage());
    }
}

এটির সুবিধাটি হ'ল আপনার অনেকগুলি বিভিন্ন মান চেকার থাকতে পারে।


1
আমি নিশ্চিত নই যে আমি সর্বশেষ মানটি যাচাই করার উপায় না রেখেই মান পরীক্ষক রাখার অবস্থা পছন্দ করি।
পিটার কে।

1

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

interface Action
{
    /**
     * @param Request $request
     * @throws RuntimeException
     * @return Response
     */
    public function act(Request $request);
}

বিবৃতি মত নয়, একটি এক্সপ্রেশনের মতো অভিনয় করে স্যুইচ অপারেটর তৈরি করা অ্যাপ্লিকেশন পরিষেবাটিকে এমন দেখাচ্ছে:

class MyApplicationService implements Action
{
    private $dataStorage;

    public function __construct(UserDataStorage $dataStorage)
    {
        $this->dataStorage = $dataStorage;
    }

    public function act(Request $request)
    {
        return
            (new _SwitchTrue(
                new _Case(
                    new EmailIsInvalid(),
                    new EmailIsInvalidResponse()
                ),
                new _Case(
                    new PasswordIsInvalid(),
                    new PasswordIsInvalidResponse()
                ),
                new _Case(
                    new EmailAlreadyRegistered($this->dataStorage),
                    new EmailAlreadyRegisteredResponse()
                ),
                new _Default(
                    new class implements Action
                    {
                        public function act(Request $request)
                        {
                            // business logic goes here

                            return new UserRegisteredResponse();
                        }
                    }
                )
            ))
                ->act($request)
            ;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.