ในการเขียนโปรแกรมด้วยภาษา AL (Application Language) สำหรับ Microsoft Dynamics 365 Business Central การควบคุมการเข้าถึงตัวแปรเป็นสิ่งสำคัญที่ช่วยให้โค้ดมีความปลอดภัยและสามารถจัดการได้ง่ายขึ้น หนึ่งในวิธีการควบคุมการเข้าถึงตัวแปรคือการใช้ตัวแปรประเภท Protected ซึ่งช่วยให้เราสามารถควบคุมการเข้าถึงตัวแปรได้ตามต้องการ ในบทความนี้ เราจะมาเจาะลึกถึงการใช้งานตัวแปร Protected พร้อมตัวอย่างการใช้งาน รวมถึงข้อดีและข้อเสียของการใช้ตัวแปรประเภทนี้
อะไรคือตัวแปร Protected?
ตัวแปร Protected ในภาษา AL คือ ตัวแปรที่สามารถเข้าถึงได้เฉพาะในออบเจ็กต์ที่ประกาศตัวแปรนั้น และในออบเจ็กต์ที่สืบทอดมาจากออบเจ็กต์นั้น ๆ เท่านั้น (Only accessible within the object where it’s declared and in its subclasses) นั่นหมายความว่าโค้ดที่อยู่นอกออบเจ็กต์ที่ไม่ได้สืบทอดจากออบเจ็กต์นั้นจะไม่สามารถเข้าถึงตัวแปรนี้ได้
การประกาศและใช้งานตัวแปร Protected
ในการประกาศตัวแปร Protected ในภาษา AL คุณสามารถทำได้โดยการเพิ่มคีย์เวิร์ด protected ก่อนการประกาศตัวแปร ตัวอย่างเช่น:
protected varShowSensitiveData: Boolean;
ในตัวอย่างนี้ ตัวแปร ShowSensitiveData สามารถถูกเข้าถึงได้เฉพาะในออบเจ็กต์ที่ประกาศตัวแปรนี้ รวมถึงออบเจ็กต์ที่สืบทอดมาจากออบเจ็กต์นี้เท่านั้น
ตัวอย่างการใช้งาน Protected Variables ในภาษา AL
สมมุติว่าเราต้องการสร้างฟีเจอร์ใหม่สำหรับการแสดงข้อมูลที่สำคัญในระบบ ซึ่งข้อมูลนี้จะถูกแสดงเฉพาะในบางสถานการณ์เท่านั้น
สร้าง Table ใหม่
table 50100 "Sensitive Data"
{
DataClassification = ToBeClassified;
fields
{
field(1; "Entry No."; Integer)
{
DataClassification = SystemMetadata;
AutoIncrement = true;
}
field(2; "Customer No."; Code[20])
{
DataClassification = CustomerContent;
}
field(3; "Sensitive Info"; Text[100])
{
DataClassification = ToBeClassified;
}
}
keys
{
key(PK; "Entry No.")
{
Clustered = true;
}
}
}
ในตัวอย่างนี้ เราได้สร้างตารางใหม่ชื่อว่า Sensitive Data เพื่อเก็บข้อมูลที่สำคัญ เช่น Sensitive Info ที่เกี่ยวข้องกับลูกค้า
สร้าง Page ใหม่
page 50101 "Sensitive Data List"
{
PageType = List;
SourceTable = "Sensitive Data";
ApplicationArea = All;
layout
{
area(content)
{
repeater(Group)
{
field("Entry No."; "Entry No.")
{
ApplicationArea = All;
}
field("Customer No."; "Customer No.")
{
ApplicationArea = All;
}
field("Sensitive Info"; "Sensitive Info")
{
ApplicationArea = All;
Visible = ShowSensitiveData; // ใช้ตัวแปร Protected ควบคุมการแสดงผล
}
}
}
}
actions
{
area(Processing)
{
action("Toggle Sensitive Info")
{
Caption = 'Show/Hide Sensitive Info';
ApplicationArea = All;
trigger OnAction()
begin
ShowSensitiveData := not ShowSensitiveData;
CurrPage.Update(false);
end;
}
}
}
trigger OnOpenPage()
begin
ShowSensitiveData := false; // ซ่อนข้อมูลที่สำคัญโดยเริ่มต้น
end;
protected var
ShowSensitiveData: Boolean;
}
ในเพจ Sensitive Data List เราได้ใช้ตัวแปร Protected ชื่อว่า ShowSensitiveData เพื่อควบคุมการแสดงผลของฟิลด์ Sensitive Info ข้อมูลนี้จะถูกซ่อนโดยค่าเริ่มต้น และจะถูกแสดงเมื่อผู้ใช้กดปุ่ม Toggle Sensitive Info
สร้าง Page Extension เพื่อขยายฟังก์ชัน
pageextension 50102 "Sensitive Data List Ext" extends "Sensitive Data List"
{
actions
{
addlast(Processing)
{
action("Reset Sensitive Info Visibility")
{
Caption = 'Reset Visibility';
ApplicationArea = All;
trigger OnAction()
begin
ShowSensitiveData := false;
CurrPage.Update(false);
end;
}
}
}
}
ใน Page Extension นี้ เราได้เพิ่มปุ่ม Reset Sensitive Info Visibility ซึ่งจะทำการซ่อนข้อมูล Sensitive Info ทุกครั้งที่ผู้ใช้กดปุ่มนี้
ตัวอย่างผลลัพธ์


ข้อดีของการใช้ Protected Variables ในภาษา AL
- การควบคุมการเข้าถึง (Access Control):
- ตัวแปร Protected ช่วยให้คุณสามารถกำหนดได้ว่าตัวแปรจะถูกเข้าถึงได้จากที่ไหนบ้าง เฉพาะภายในตัวโค้ดหรือจากออบเจ็กต์ที่สืบทอด (Inheritance) มาเท่านั้น ข้อมูลสำคัญจึงไม่ถูกแก้ไขโดยไม่จำเป็น
- การสืบทอด (Inheritance):
- ออบเจ็กต์ย่อยสามารถใช้ตัวแปร Protected จากออบเจ็กต์หลักได้อย่างอิสระ ช่วยให้สามารถเพิ่มฟังก์ชันการทำงานใหม่ ๆ โดยใช้ข้อมูลที่ถูกปกป้องในออบเจ็กต์หลักได้อย่างมีประสิทธิภาพ
- การออกแบบโค้ดที่ยืดหยุ่น (Flexible Code Design):
- ตัวแปร Protected ทำให้คุณสามารถสร้างโค้ดที่ยืดหยุ่น โดยการเก็บข้อมูลและฟังก์ชันการทำงานในออบเจ็กต์หลัก แล้วสืบทอดและใช้งานในออบเจ็กต์ย่อย ซึ่งช่วยลดการทำซ้ำโค้ด (Code Duplication)
- ลดข้อผิดพลาด (Reduced Errors):
- เนื่องจากตัวแปร Protected จะไม่สามารถเข้าถึงได้จากภายนอกออบเจ็กต์หรือออบเจ็กต์ที่ไม่ได้สืบทอด การลดการเข้าถึงตัวแปรที่ไม่จำเป็นจะช่วยลดโอกาสในการเกิดข้อผิดพลาดในโค้ด
ข้อเสียของการใช้ Protected Variables ในภาษา AL
- ความซับซ้อนในการจัดการ (Complex Management):
- การใช้ตัวแปร Protected อาจทำให้โค้ดซับซ้อนขึ้น โดยเฉพาะเมื่อมีออบเจ็กต์ย่อยหลายออบเจ็กต์สืบทอดจากออบเจ็กต์หลัก ผู้พัฒนาต้องเข้าใจโครงสร้างการเข้าถึงข้อมูลทั้งหมด ทำให้การบำรุงรักษาโค้ดยากขึ้น
- การพึ่งพาคลาสหลัก (Base Class Dependency):
- เมื่อออบเจ็กต์ย่อยพึ่งพาตัวแปร Protected จากออบเจ็กต์หลัก หากออบเจ็กต์หลักมีการเปลี่ยนแปลง จะต้องมีการปรับปรุงโค้ดในออบเจ็กต์ย่อยให้สอดคล้องกัน ซึ่งอาจเพิ่มงานในการบำรุงรักษา
- การใช้ที่ไม่จำเป็น (Unnecessary Usage):
- หากมีการใช้ Protected โดยไม่จำเป็น เช่น ประกาศตัวแปร Protected ที่ไม่ต้องการความปกป้อง อาจทำให้โค้ดยุ่งยากโดยไม่จำเป็น ซึ่งควรใช้ Protected เฉพาะในกรณีที่จำเป็นจริง ๆ เท่านั้น
- ความยุ่งยากในการขยาย (Complicated Extensions):
- เมื่อมีการสืบทอดตัวแปร Protected หลายชั้น อาจทำให้โค้ดยุ่งยากในการเข้าใจและขยายฟังก์ชันใหม่ ๆ เนื่องจากต้องติดตามว่าแต่ละออบเจ็กต์ใช้ตัวแปรเหล่านี้อย่างไร
สรุป
การใช้ตัวแปร Protected ในภาษา AL เป็นเทคนิคที่มีประโยชน์และทรงพลังในการควบคุมการเข้าถึงข้อมูลและการสืบทอดฟังก์ชันการทำงานไปยังออบเจ็กต์ย่อย การใช้ตัวแปร Protected อย่างถูกต้องจะช่วยให้โค้ดของคุณมีความปลอดภัย ยืดหยุ่น และง่ายต่อการบำรุงรักษา อย่างไรก็ตาม ต้องใช้อย่างระมัดระวังเพื่อหลีกเลี่ยงความซับซ้อนและปัญหาที่อาจเกิดขึ้นในการจัดการโค้ด





































