Add interfaces knowledge domain and review leaf skill (#42)

Adds the interfaces knowledge domain covering AL interfaces and enum-with-implementation: three atomic articles with good/bad AL samples, a new al-interfaces-review leaf skill, and additive wiring into al-code-review and the README. Purely additive; no contract change.

Part of #34.

Co-authored-by: Jesper Schulz-Wedde <jesper.schulzwedde@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Jesper Schulz-Wedde 2026-06-25 12:20:56 +02:00 committed by GitHub
parent 45c2b2f5ec
commit 23d5478ac6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 458 additions and 2 deletions

View file

@ -0,0 +1,51 @@
interface IDiscountCalculation
{
procedure CalculateDiscount(Amount: Decimal): Decimal;
}
codeunit 50213 "Standard Discount Calc" implements IDiscountCalculation
{
procedure CalculateDiscount(Amount: Decimal): Decimal
begin
// Production rule: 10% off amounts over 1000.
if Amount > 1000 then
exit(Amount * 0.1);
exit(0);
end;
}
codeunit 50214 "Test Discount Calc" implements IDiscountCalculation
{
// Lightweight test double: a fixed, predictable value so a test can assert
// order totals without depending on the production discount rule.
procedure CalculateDiscount(Amount: Decimal): Decimal
begin
exit(100);
end;
}
codeunit 50215 "Order Total"
{
var
DiscountCalc: Interface IDiscountCalculation;
// Production wiring: a codeunit assigns directly to the interface variable.
procedure UseProductionCalculation()
var
StdCalc: Codeunit "Standard Discount Calc";
begin
DiscountCalc := StdCalc;
end;
// Setter injection: a test passes "Test Discount Calc" instead, with no
// enum and no change to the consumer. The dependency is an interface.
procedure SetDiscountCalculation(NewDiscountCalc: Interface IDiscountCalculation)
begin
DiscountCalc := NewDiscountCalc;
end;
procedure NetAmount(Amount: Decimal): Decimal
begin
exit(Amount - DiscountCalc.CalculateDiscount(Amount));
end;
}