我有一個接口IComm
聲明一個例程SetMonitorLogLevel()
:如何將DRY應用於涉及表單組件的接口實現?
unit IFaceComm;
interface
type
TMonitorLogLevel = (mllOnlyImportant, mllAll);
IComm = Interface(IInterface)
procedure SetMonitorLogLevel(LogLevel: TMonitorLogLevel);
end;
end.
的接口由2種形式,其是彼此相似的,frmBarComm
和frmFooComm
,看起來像這樣實現的:
TfrmBarComm = class(TForm, IFaceComm.IComm)
cboDebugLevel: TComboBox;
private
procedure SetMonitorLogLevel(LogLevel: IFaceComm.TMonitorLogLevel);
end;
請注意,2表單有很多相同的組件,例如cboDebugLevel
,但也可以具有其他組件。
兩種形式實現完全相同方式IComm.SetMonitorLogLevel()
:
procedure TfrmBarComm.SetMonitorLogLevel(LogLevel: IFaceComm.TMonitorLogLevel);
begin
case LogLevel of
IFaceComm.TMonitorLogLevel.mllOnlyImportant:
Self.cboDebugLevel.ItemIndex := 0;
IFaceComm.TMonitorLogLevel.mllAll:
Self.cboDebugLevel.ItemIndex := 1;
end;
end;
如何避免違反不要重複自己(DRY)的原則?我經常遇到這個問題,當複製粘貼的例程比我上面顯示的簡單例子大得多時,它特別難看。
實現一類接口,並創建表單從該類繼承 – fantaghirocco
@fantaghirocco當你有兩個這樣的接口,A和B.然後,你必須Form1中會發生什麼事是想要實現A,想要實現B和Form3的Form2比想要實現A和B? –
@大衛Heffernan這就是爲什麼我upvoted你的答案 – fantaghirocco