การตรวจสอบอย่างคล่องแคล่วด้วยวิธีการผูกมัดใน Java: การปรับปรุงความสามารถในการอ่านโค้ดและความยืดหยุ่น

May 03 2023
การแนะนำ
ในการพัฒนาซอฟต์แวร์ การตรวจสอบความถูกต้องของข้อมูลเป็นสิ่งสำคัญเพื่อให้มั่นใจถึงความสมบูรณ์และความน่าเชื่อถือของระบบ การตรวจสอบอินพุตของผู้ใช้ คำขอ API หรือข้อมูลอื่นใดที่ไหลผ่านระบบเป็นสิ่งสำคัญเพื่อป้องกันข้อผิดพลาด การละเมิดข้อมูล และพฤติกรรมที่ไม่คาดคิดอื่นๆ
เครดิตภาพ:อุรุพงศ์

ในการพัฒนาซอฟต์แวร์ การตรวจสอบความถูกต้องของข้อมูลเป็นสิ่งสำคัญเพื่อให้มั่นใจถึงความสมบูรณ์และความน่าเชื่อถือของระบบ การตรวจสอบอินพุตของผู้ใช้ คำขอ API หรือข้อมูลอื่นใดที่ไหลผ่านระบบเป็นสิ่งสำคัญเพื่อป้องกันข้อผิดพลาด การละเมิดข้อมูล และพฤติกรรมที่ไม่คาดคิดอื่นๆ วิธีการทั่วไปอย่างหนึ่งในการดำเนินการตรวจสอบข้อมูลคือการใช้อินเทอร์เฟซ Validator ที่กำหนดสัญญาสำหรับการตรวจสอบความถูกต้องของข้อมูลประเภทต่างๆ

ใน Java บางครั้งการใช้ตรรกะการตรวจสอบความถูกต้องอาจซับซ้อนและจัดการได้ยาก โดยเฉพาะอย่างยิ่งเมื่อต้องจัดการกับกฎการตรวจสอบหลายข้อ อย่างไรก็ตาม การใช้วิธีการผูกมัดในอินเทอร์เฟซ Validator สามารถทำให้กระบวนการง่ายขึ้นอย่างมาก ทำให้โค้ดอ่านง่ายขึ้น ใช้ซ้ำได้ และบำรุงรักษาได้

ในบล็อกโพสต์นี้ เราจะสำรวจวิธีการเพิ่มวิธีการเชื่อมโยงไปยังอินเทอร์เฟซ Validator และใช้ประโยชน์จากวิธีการเหล่านี้เพื่อสร้างตรรกะการตรวจสอบที่แข็งแกร่งและยืดหยุ่น เราจะให้ตัวอย่างรหัสเพื่อสาธิตแนวคิด

ทำไมต้องผูกมัดวิธีการ?

แนวทางดั้งเดิมของการใช้Validatorอินเทอร์เฟซมักจะเกี่ยวข้องกับการเรียกวิธีการตรวจสอบความถูกต้องหลายวิธีต่อกัน ซึ่งอาจส่งผลให้เกิดคำสั่ง if-else ที่ซ้อนกัน และทำให้โค้ดอ่านและบำรุงรักษาได้ยาก ด้วยการเพิ่มวิธีการผูกมัดเข้ากับอินเทอร์เฟซ Validator เราสามารถใช้ประโยชน์จากอินเทอร์เฟซที่คล่องแคล่วซึ่งช่วยให้เขียนตรรกะการตรวจสอบได้กระชับและชัดเจนยิ่งขึ้น

การสร้างส่วนต่อประสานตัวตรวจสอบความถูกต้อง

เริ่มต้นด้วยการสร้างValidatorอินเทอร์เฟซซึ่งจะทำหน้าที่เป็นรากฐานสำหรับวิธีการผูกมัดของเรา อินเทอร์เฟซ Validator จะมีประเภท T ทั่วไป ซึ่งแสดงถึงประเภทของข้อมูลที่จะตรวจสอบ และจะกำหนดการตรวจสอบความถูกต้องของเมธอดเดียวที่รับวัตถุประเภทหนึ่งTและส่งคืนValidationResultวัตถุ ซึ่งบ่งชี้ว่าการตรวจสอบความถูกต้องสำเร็จหรือไม่

@FunctionalInterface
public interface Validator<T> {
    ValidationResult validate(T t);
}

public class ValidationResult {
    private final boolean isValid;
    private final String message;

    public ValidationResult(boolean isValid, String message) {
        this.isValid = isValid;
        this.message = message;
    }

    public boolean isValid() {
        return isValid;
    }

    public String getMessage() {
        return message;
    }
}

ต่อไป เราจะเพิ่มวิธีการผูกมัดสามวิธีให้กับValidatorอินเทอร์เฟซ: and, or, negateและ

เมธอดandใช้ค่าอื่นValidatorเป็นพารามิเตอร์และส่งกลับ Validator ใหม่ที่ดำเนินการตรวจสอบความถูกต้องทั้งสองอย่าง หากการตรวจสอบล้มเหลว Validator ใหม่จะส่งกลับผลการตรวจสอบที่ล้มเหลว

default Validator<T> and(Validator<? super T> other) {
    return obj -> {
        ValidationResult result = this.validate(obj);
        return !result.isValid() ? result : other.validate(obj);
    };
}

default Validator<T> or(Validator<? super T> other) {
    return obj -> {
        ValidationResult result = this.validate(obj);
        return result.isValid() ? result : other.validate(obj);
    };
}

default Validator<T> negate() {
    return obj -> {
        ValidationResult result = this.validate(obj);
        return new ValidationResult(!result.isValid(), result.getMessage());
    };
}

มาดูกันว่าเราจะใช้วิธีการผูกมัดเพื่อสร้างตัวตรวจสอบแบบรวมที่ตรวจสอบทั้งอีเมลและชื่อได้อย่างไร เราจะใช้ตัวตรวจสอบอย่างง่ายสองตัวสำหรับการตรวจสอบอีเมลและชื่อเป็นตัวอย่าง

Validator<String> emailValidator = str -> {
    if (str == null || !str.matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}")) {
        return new ValidationResult(false, "Email is not valid");
    }
    return new ValidationResult(true, "");
};

Validator<String> nameValidator = str -> {
    if (str == null || str.trim().isEmpty()) {
        return new ValidationResult(false, "Name cannot be empty");
    }
    return new ValidationResult(true, "");
};

Validator<String> combinedValidator = emailValidator.and(nameValidator);

ValidationResult result = combinedValidator.validate("[email protected]");

สุดท้าย เราได้เรียกvalidateเมธอดใน the combinedValidatorพร้อมตัวอย่างการป้อนอีเมล “ [email protected] ” เมธอดvalidateส่งคืนValidationResultออบเจกต์ ระบุว่าการตรวจสอบสำเร็จหรือไม่ ในตัวอย่างนี้ เนื่องจากการป้อนอีเมลถูกต้องและการป้อนชื่อไม่ว่างเปล่า ฟิลด์isValidของresultออบเจกต์จะเป็นtrueบ่งชี้ว่าการตรวจสอบสำเร็จ และgetMessageเมธอดจะส่งคืนสตริงว่างเป็นข้อความการตรวจสอบ

คุณสามารถปรับแต่งเพิ่มเติมและเชื่อมโยง Validator หลายตัวเข้าด้วยกันเพื่อสร้างตรรกะการตรวจสอบที่ซับซ้อนมากขึ้นตามความต้องการของคุณ วิธีการผูกมัดในอินเทอร์เฟซ Validator มอบวิธีการที่ยืดหยุ่นและชัดเจนในการสร้างตรรกะการตรวจสอบที่แข็งแกร่งและบำรุงรักษาได้ใน Java

ข้อดีของวิธีการผูกมัด

วิธีการเพิ่มวิธีการผูกมัดไปยังส่วนต่อประสาน Validator มีข้อดีหลายประการ:

Encapsulation : ตรรกะการตรวจสอบถูกสรุปไว้ในอินเทอร์เฟซ Validator และการใช้งาน สิ่งนี้ส่งเสริมการแยกข้อกังวลที่ดีขึ้นและทำให้ง่ายต่อการเปลี่ยนตรรกะการตรวจสอบโดยไม่กระทบกับรหัสที่เหลือ

การใช้ซ้ำได้ : อินเทอร์เฟซ Validator และการใช้งานสามารถนำมาใช้ซ้ำได้ในส่วนต่าง ๆ ของโค้ดเบส ลดการทำซ้ำโค้ดและส่งเสริมความสอดคล้องในตรรกะการตรวจสอบความถูกต้อง สิ่งนี้สามารถประหยัดเวลาและความพยายามในการพัฒนา

ความสามารถในการจัดองค์ประกอบ : วิธีการผูกมัดช่วยให้สามารถจัดองค์ประกอบเครื่องมือตรวจสอบความถูกต้องขนาดเล็กและเรียบง่ายได้ง่ายขึ้นเพื่อแสดงกฎการตรวจสอบความถูกต้องที่ซับซ้อนด้วยวิธีที่กระชับและอ่านง่าย สิ่งนี้ทำให้ง่ายต่อการเข้าใจและรักษาตรรกะการตรวจสอบความถูกต้อง

ความยืดหยุ่น : วิธีการเชื่อมโยงเป็นวิธีที่ยืดหยุ่นในการรวมตัวตรวจสอบความถูกต้องในรูปแบบต่างๆ เพื่อตอบสนองความต้องการเฉพาะของกรณีการใช้งานเฉพาะ สิ่งนี้ช่วยให้มีตรรกะการตรวจสอบแบบไดนามิกและปรับเปลี่ยนได้ซึ่งสามารถพัฒนาไปตามกาลเวลา

ความสามารถในการทดสอบ : การห่อหุ้มและการนำกลับมาใช้ใหม่ได้ของอินเทอร์เฟซ Validator และการนำไปใช้ทำให้เขียนการทดสอบหน่วยสำหรับลอจิกการตรวจสอบได้ง่ายขึ้น วิธีการผูกมัดยังช่วยให้สามารถทดสอบลอจิกการตรวจสอบได้ละเอียดมากขึ้น ทำให้มั่นใจได้ถึงความทนทานและความน่าเชื่อถือ

บทสรุป

โดยสรุป การรวมรูปแบบการออกแบบที่ใช้วิธีการผูกมัดในอินเทอร์เฟซ Validator สามารถปรับปรุงประสิทธิภาพของการตรวจสอบโค้ดได้อย่างมาก แนวทางนี้ส่งเสริมการห่อหุ้ม การใช้ซ้ำ ความสามารถในการจัดองค์ประกอบ ความยืดหยุ่น และความสามารถในการทดสอบ ส่งผลให้โค้ดมีความแข็งแกร่งและบำรุงรักษาได้มากขึ้น ด้วยการรวมวิธีการตรวจสอบเข้าด้วยกัน เราสามารถลดความซับซ้อนของตรรกะการตรวจสอบโค้ดและทำให้กระชับและอ่านง่ายขึ้น สิ่งนี้ไม่เพียงช่วยตรวจจับข้อผิดพลาดตั้งแต่เนิ่นๆ และปฏิบัติตามข้อกำหนดเท่านั้น แต่ยังช่วยปรับปรุงการจัดระเบียบโค้ดและส่งเสริมแนวทางปฏิบัติในการพัฒนาซอฟต์แวร์คุณภาพสูงอีกด้วย ดังนั้น เรามายอมรับรูปแบบการออกแบบนี้ในความพยายามตรวจสอบโค้ดของเราเพื่อสร้างซอฟต์แวร์ที่น่าเชื่อถือและไว้วางใจได้

มีความสุขในการเข้ารหัส!