แนะนำ
รูปแบบกลยุทธ์กำหนดตระกูลอัลกอริทึมและห่อหุ้มพวกเขาแยกต่างหากเพื่อให้พวกเขาสามารถแทนที่ซึ่งกันและกัน โมเดลนี้ช่วยให้การเปลี่ยนแปลงในอัลกอริทึมไม่ส่งผลกระทบต่อลูกค้าโดยใช้อัลกอริทึม
ข้อความ
ก่อนที่จะเข้าใจรูปแบบนโยบายก่อนอื่นให้ยกตัวอย่าง โดยทั่วไปหากเราต้องการตรวจสอบความถูกต้องตามกฎหมายของข้อมูลเรามักจะตัดสินตามคำสั่งของการกวาด แต่สิ่งนี้นำมาหลายปัญหา ก่อนอื่นถ้าเราเพิ่มความต้องการเราต้องปรับเปลี่ยนรหัสนี้อีกครั้งเพื่อเพิ่มตรรกะและมันจะซับซ้อนมากขึ้นเรื่อย ๆ เมื่อทำการทดสอบหน่วย รหัสมีดังนี้:
การคัดลอกรหัสมีดังนี้:
duridator = {
ตรวจสอบ: ฟังก์ชัน (ค่า, ประเภท) {
สวิตช์ (พิมพ์) {
กรณี 'isnonempty':
-
กลับมาจริง; // ผลการตรวจสอบที่ไม่มีการยกเว้น
-
กรณี 'isnumber':
-
กลับมาจริง; // ผลการตรวจสอบหมายเลข
หยุดพัก;
-
กรณี 'isalphanum':
-
กลับมาจริง; // ผลการตรวจสอบตัวตัวเลข
-
ค่าเริ่มต้น:
-
กลับมาจริง;
-
-
-
-
// ทดสอบ
การแจ้งเตือน (validator.validate ("123", "isnonempty"));
ดังนั้นจะหลีกเลี่ยงปัญหาในรหัสข้างต้นได้อย่างไร? ตามรูปแบบนโยบายเราสามารถห่อหุ้มรหัสการทำงานเดียวกันลงในคลาสที่แตกต่างกันแยกต่างหากจากนั้นจัดการผ่านคลาสการประมวลผลนโยบายแบบครบวงจร ตกลงก่อนอื่นเราจะกำหนดคลาสการประมวลผลนโยบายรหัสมีดังนี้:
การคัดลอกรหัสมีดังนี้:
var validator = {
// สถานที่ทั้งหมดที่สามารถจัดเก็บคลาสการประมวลผลกฎการตรวจสอบความถูกต้องทั้งหมดจะถูกกำหนดแยกต่างหากในภายหลัง
ประเภท: {},
// ข้อความแสดงข้อผิดพลาดที่สอดคล้องกับประเภทการตรวจสอบ
ข้อความ: [],
// แน่นอนประเภทการตรวจสอบที่ต้องใช้
กำหนดค่า: {}
// วิธีการตรวจสอบสาธารณะเปิดเผย
// พารามิเตอร์ที่ผ่านคือ key => ค่าคู่
ตรวจสอบ: ฟังก์ชั่น (ข้อมูล) {
var i, msg, ประเภท, checker, result_ok;
// ล้างข้อความแสดงข้อผิดพลาดทั้งหมด
this.messages = [];
สำหรับ (ฉันอยู่ในข้อมูล) {
if (data.hasownproperty (i)) {
type = this.config [i]; // ตรวจสอบว่ามีกฎการตรวจสอบตามคีย์หรือไม่
checker = this.types [type]; // รับคลาสการตรวจสอบสำหรับกฎการตรวจสอบ
ถ้า (! พิมพ์) {
ดำเนินการต่อ; // หากไม่มีกฎการตรวจสอบจะไม่มีการประมวลผล
-
if (! checker) {// หากไม่มีกฎการตรวจสอบ
โยน {
ชื่อ: "ValidationError",
ข้อความ: "ไม่มีตัวจัดการที่จะตรวจสอบประเภท" + พิมพ์
-
-
result_ok = checker.validate (ข้อมูล [i]); // ตรวจสอบโดยใช้คลาสการตรวจสอบเดียวที่พบ
if (! result_ok) {
msg = "ค่าไม่ถูกต้องสำหรับ *" + i + " *," + checker.instructions;
this.messages.push (msg);
-
-
-
คืนสิ่งนี้ haserrors ();
-
// ผู้ช่วย
haserrors: function () {
ส่งคืนสิ่งนี้ messages.length! == 0;
-
-
จากนั้นส่วนที่เหลือคือการกำหนดคลาสการตรวจสอบต่างๆที่เก็บไว้ในประเภท ขอตัวอย่างสองสามอย่างที่นี่:
การคัดลอกรหัสมีดังนี้:
// ตรวจสอบว่าค่าที่กำหนดไม่ว่างเปล่า
Validator.types.isnonEmpty = {
ตรวจสอบ: ฟังก์ชัน (ค่า) {
ค่าส่งคืน! == "";
-
คำแนะนำ: "ค่าที่ผ่านไม่สามารถว่างเปล่า"
-
// ตรวจสอบว่าค่าที่กำหนดเป็นตัวเลข
Validator.types.isnumber = {
ตรวจสอบ: ฟังก์ชัน (ค่า) {
return! isnan (ค่า);
-
คำแนะนำ: "ค่าที่ส่งผ่านสามารถเป็นหมายเลขทางกฎหมายเท่านั้นตัวอย่างเช่น: 1, 3.14 หรือ 2010"
-
// ตรวจสอบว่าค่าที่กำหนดเป็นเพียงตัวอักษรหรือตัวเลข
validator.types.isalphanum = {
ตรวจสอบ: ฟังก์ชัน (ค่า) {
return!/[^a-z0-9] /i.test (ค่า);
-
คำแนะนำ: "ค่าที่ผ่านสามารถปกป้องตัวอักษรและตัวเลขเท่านั้นและไม่สามารถมีอักขระพิเศษ"
-
เมื่อใช้มันก่อนอื่นเราต้องกำหนดชุดข้อมูลที่ต้องตรวจสอบและจากนั้นเราต้องกำหนดประเภทกฎที่ต้องตรวจสอบสำหรับแต่ละข้อมูล รหัสมีดังนี้:
การคัดลอกรหัสมีดังนี้:
var data = {
first_name: "ทอม",
last_name: "xu",
อายุ: "ไม่ทราบ",
ชื่อผู้ใช้: "Tomxu"
-
Validator.config = {
first_name: 'isnonempty',
อายุ: 'iSnumber',
ชื่อผู้ใช้: 'isalphanum'
-
ในที่สุดรหัสเพื่อให้ได้ผลการตรวจสอบนั้นง่าย:
การคัดลอกรหัสมีดังนี้:
Validator.validate (ข้อมูล);
if (validator.haserrors ()) {
console.log (validator.messages.oin ("/n"));
-
สรุป
รูปแบบกลยุทธ์กำหนดชุดของอัลกอริทึม แนวคิดอัลกอริทึมทั้งหมดเหล่านี้ทำสิ่งเดียวกัน แต่การใช้งานแตกต่างกัน พวกเขาสามารถเรียกวิธีการทั้งหมดในลักษณะเดียวกันลดการมีเพศสัมพันธ์ระหว่างคลาสอัลกอริทึมต่างๆและคลาสอัลกอริทึมที่ใช้
จากระดับอื่นการกำหนดคลาสอัลกอริทึมแยกต่างหากยังช่วยอำนวยความสะดวกในการทดสอบหน่วยเนื่องจากสามารถทดสอบแยกต่างหากผ่านอัลกอริทึมของคุณเอง
ในทางปฏิบัติไม่เพียง แต่อัลกอริทึมเท่านั้นที่สามารถห่อหุ้มได้ แต่ยังมีกฎเกือบทุกประเภท มีความจำเป็นที่จะต้องใช้กฎเกณฑ์ทางธุรกิจที่แตกต่างกันในช่วงเวลาที่ต่างกันในระหว่างกระบวนการวิเคราะห์ดังนั้นคุณสามารถพิจารณาได้ว่ารูปแบบนโยบายจำเป็นต้องจัดการกับการเปลี่ยนแปลงที่หลากหลาย