วิธีง่าย ๆ ในการรักษาการตั้งค่าของแอปพลิเคชัน Java จะถูกแสดงด้วยไฟล์ข้อความที่มีนามสกุล ".properties" ที่มีตัวระบุของแต่ละการตั้งค่าที่เกี่ยวข้องกับค่าเฉพาะ (ค่านี้อาจเป็นตัวเลขสตริงวันที่ ฯลฯ ) . C # ใช้วิธีการที่คล้ายกัน แต่ไฟล์ข้อความจะต้องมีชื่อว่า "App.config" ในทั้งสองกรณีในซอร์สโค้ดคุณต้องเริ่มต้นคลาสเฉพาะสำหรับการอ่านการตั้งค่า: คลาสนี้มีวิธีการส่งคืนค่า (เป็นสตริง) ที่เกี่ยวข้องกับตัวระบุการตั้งค่าที่ระบุ
// Java example
Properties config = new Properties();
config.load(...);
String valueStr = config.getProperty("listening-port");
// ...
// C# example
NameValueCollection setting = ConfigurationManager.AppSettings;
string valueStr = setting["listening-port"];
// ...
ในทั้งสองกรณีเราควรแยกสตริงที่โหลดจากไฟล์การกำหนดค่าและกำหนดค่าที่แปลงให้กับวัตถุที่พิมพ์ที่เกี่ยวข้อง (ข้อผิดพลาดในการแยกวิเคราะห์อาจเกิดขึ้นในช่วงนี้) หลังจากขั้นตอนการแยกวิเคราะห์เราต้องตรวจสอบว่าค่าการตั้งค่าเป็นของโดเมนเฉพาะของความถูกต้อง: ตัวอย่างเช่นขนาดสูงสุดของคิวควรเป็นค่าบวกค่าบางอย่างอาจเกี่ยวข้อง (ตัวอย่าง: min <max ) และอื่น ๆ
สมมติว่าแอปพลิเคชันควรโหลดการตั้งค่าทันทีที่เริ่ม: กล่าวอีกนัยหนึ่งการทำงานครั้งแรกที่แอปพลิเคชันดำเนินการคือโหลดการตั้งค่า ค่าที่ไม่ถูกต้องสำหรับการตั้งค่าจะต้องถูกแทนที่โดยอัตโนมัติด้วยค่าเริ่มต้น: หากสิ่งนี้เกิดขึ้นกับกลุ่มของการตั้งค่าที่เกี่ยวข้องการตั้งค่าเหล่านั้นจะถูกตั้งค่าทั้งหมดด้วยค่าเริ่มต้น
วิธีที่ง่ายที่สุดในการดำเนินการเหล่านี้คือการสร้างวิธีที่แยกวิเคราะห์การตั้งค่าทั้งหมดก่อนจากนั้นตรวจสอบค่าที่โหลดและตั้งค่าเริ่มต้นในที่สุด อย่างไรก็ตามการบำรุงรักษาเป็นเรื่องยากหากคุณใช้วิธีการนี้: เนื่องจากจำนวนการตั้งค่าเพิ่มขึ้นในขณะที่พัฒนาแอปพลิเคชันมันจะยากที่จะปรับปรุงรหัส
เพื่อแก้ปัญหานี้ฉันคิดว่าจะใช้รูปแบบวิธีการของแม่แบบดังนี้
public abstract class Setting
{
protected abstract bool TryParseValues();
protected abstract bool CheckValues();
public abstract void SetDefaultValues();
/// <summary>
/// Template Method
/// </summary>
public bool TrySetValuesOrDefault()
{
if (!TryParseValues() || !CheckValues())
{
// parsing error or domain error
SetDefaultValues();
return false;
}
return true;
}
}
public class RangeSetting : Setting
{
private string minStr, maxStr;
private byte min, max;
public RangeSetting(string minStr, maxStr)
{
this.minStr = minStr;
this.maxStr = maxStr;
}
protected override bool TryParseValues()
{
return (byte.TryParse(minStr, out min)
&& byte.TryParse(maxStr, out max));
}
protected override bool CheckValues()
{
return (0 < min && min < max);
}
public override void SetDefaultValues()
{
min = 5;
max = 10;
}
}
ปัญหาคือด้วยวิธีนี้เราจำเป็นต้องสร้างคลาสใหม่สำหรับแต่ละการตั้งค่าแม้สำหรับค่าเดียว มีวิธีแก้ไขปัญหาอื่น ๆ อีกไหม?
สรุป:
- บำรุงรักษาง่าย: ตัวอย่างเช่นการเพิ่มพารามิเตอร์หนึ่งตัวหรือมากกว่า
- Extensibility: เวอร์ชันแรกของแอปพลิเคชั่นสามารถอ่านไฟล์การกำหนดค่าไฟล์เดียว แต่เวอร์ชั่นที่ใหม่กว่าอาจให้ความเป็นไปได้ของการตั้งค่าผู้ใช้หลายคน (ผู้ดูแลระบบตั้งค่าพื้นฐานผู้ใช้สามารถตั้งค่าบางอย่างได้
- การออกแบบเชิงวัตถุ