С определенного момента я устал от написания заданных условий (and
, or
), потому что для большего количества условий или длинных имен переменных это становится неуклюжим и раздражает, когда приходится писать заново.Поэтому я начал писать помощников, чтобы я мог писать ASet.ContainsOne([ceValue1, ceValue2])
вместо (ceValue1 in ASet) or (ceValue2 in ASet)
.
type
TCustomEnum = (ceValue1, ceValue2, ceValue3);
TCustomSet = set of TCustomEnum;
TCustomSetHelper = record helper for TCustomSet
function ContainsOne(ASet: TCustomSet): Boolean;
function ContainsAll(ASet: TCustomSet): Boolean;
end;
implementation
function TCustomSetHelper.ContainsOne(ASet: TCustomSet): Boolean;
var
lValue : TCustomEnum;
begin
for lValue in ASet do
begin
if lValue in Self then
Exit(True);
end;
Result := False;
end;
function TCustomSetHelper.ContainsAll(ASet: TCustomSet): Boolean;
var
lValue : TCustomEnum;
begin
Result := True;
for lValue in ASet do
begin
if not (lValue in Self) then
Exit(False);
end;
end;
К сожалению, это не самое эффективное решение, и оно противоречит принципу СУХОЙ.К моему удивлению, я не нашел никого, кто бы имел дело с той же проблемой, так что мне интересно, есть ли лучшее (универсальное) решение?