Probleem
RowFormatter en ColumnBuilder bevatten branching op concrete field-types:
if (\$field instanceof BooleanField) { ... }
elseif (\$field instanceof CurrencyField) { ... }
elseif (\$field instanceof BelongsToField) { ... }
// ...
Elke nieuwe field-type vereist edits in beide bestanden. Textbook OCP-violation.
Voorstel
Verplaats de presentatie-logica naar de Field-base als polymorfe methods:
abstract class Field
{
abstract public function getDisplayValue(mixed \$rawValue, Model \$record): string;
public function getColumnDefinition(): array { /* default */ }
}
Elk concreet field-type override deze methods met zijn eigen logica. RowFormatter en ColumnBuilder roepen de interface aan, niet instanceof.
Impact
- Nieuwe field-types kunnen toegevoegd worden zonder RowFormatter/ColumnBuilder aan te raken
- Test-coverage verbetert: elke field-type heeft zelf testbare display-logica
- Refactor is intrusief — alle 23 field-types moeten een
getDisplayValue krijgen
Acceptatiecriteria
Probleem
RowFormatterenColumnBuilderbevatten branching op concrete field-types:Elke nieuwe field-type vereist edits in beide bestanden. Textbook OCP-violation.
Voorstel
Verplaats de presentatie-logica naar de Field-base als polymorfe methods:
Elk concreet field-type override deze methods met zijn eigen logica. RowFormatter en ColumnBuilder roepen de interface aan, niet
instanceof.Impact
getDisplayValuekrijgenAcceptatiecriteria
getDisplayValue()op Fieldinstanceof <FieldType>meer inRowFormatterofColumnBuilder(alleeninstanceof Fieldmag)