Refactoring
This commit is contained in:
+50
-48
@@ -21,10 +21,11 @@ type
|
||||
FState: IMycState;
|
||||
FTag: TMycNotifyList<IMycSubscriber>.TTag; // Tag identifying this subscription within the notifier list.
|
||||
function GetState: IMycState;
|
||||
constructor Create(const AState: IMycState; ATag: TMycNotifyList<IMycSubscriber>.TTag);
|
||||
public
|
||||
constructor Create(const AState: IMycState; ATag: TMycNotifyList<IMycSubscriber>.TTag);
|
||||
// Unsubscribes from the associated signal.
|
||||
procedure Unsubscribe;
|
||||
class operator Initialize(out Dest: TMycSubscription);
|
||||
property State: IMycState read GetState;
|
||||
end;
|
||||
|
||||
@@ -154,44 +155,44 @@ uses
|
||||
System.SyncObjs; // For TInterlocked
|
||||
|
||||
type
|
||||
// TMycNullState implements a "null object" pattern for IMycState.
|
||||
// This state is always considered "set".
|
||||
TMycNullState = class(TInterfacedObject, IMycState)
|
||||
protected
|
||||
// IMycState
|
||||
function GetIsSet: Boolean;
|
||||
function Subscribe(const Subscriber: IMycSubscriber): TMycSubscription;
|
||||
procedure Unsubscribe(Tag: TMycNotifyList<IMycSubscriber>.TTag);
|
||||
public
|
||||
constructor Create;
|
||||
end;
|
||||
|
||||
{ TMycNullState }
|
||||
|
||||
constructor TMycNullState.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
end;
|
||||
|
||||
function TMycNullState.GetIsSet: Boolean;
|
||||
begin
|
||||
Result := true; // Null state is always set.
|
||||
end;
|
||||
|
||||
function TMycNullState.Subscribe(const Subscriber: IMycSubscriber): TMycSubscription;
|
||||
begin
|
||||
// Since the state is always set, notify the subscriber immediately.
|
||||
if Assigned(Subscriber) then
|
||||
begin
|
||||
Subscriber.Notify;
|
||||
end;
|
||||
// No ongoing subscription is necessary or meaningful for a null state.
|
||||
Result.Create(Self, nil); // Return an empty subscription.
|
||||
end;
|
||||
|
||||
procedure TMycNullState.Unsubscribe(Tag: TMycNotifyList<IMycSubscriber>.TTag);
|
||||
begin
|
||||
// Unsubscribing from a null state has no effect.
|
||||
// TMycNullState implements a "null object" pattern for IMycState.
|
||||
// This state is always considered "set".
|
||||
TMycNullState = class(TInterfacedObject, IMycState)
|
||||
protected
|
||||
// IMycState
|
||||
function GetIsSet: Boolean;
|
||||
function Subscribe(const Subscriber: IMycSubscriber): TMycSubscription;
|
||||
procedure Unsubscribe(Tag: TMycNotifyList<IMycSubscriber>.TTag);
|
||||
public
|
||||
constructor Create;
|
||||
end;
|
||||
|
||||
{ TMycNullState }
|
||||
|
||||
constructor TMycNullState.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
end;
|
||||
|
||||
function TMycNullState.GetIsSet: Boolean;
|
||||
begin
|
||||
Result := true; // Null state is always set.
|
||||
end;
|
||||
|
||||
function TMycNullState.Subscribe(const Subscriber: IMycSubscriber): TMycSubscription;
|
||||
begin
|
||||
// Since the state is always set, notify the subscriber immediately.
|
||||
if Assigned(Subscriber) then
|
||||
begin
|
||||
Subscriber.Notify;
|
||||
end;
|
||||
// No ongoing subscription is necessary or meaningful for a null state.
|
||||
Result.Create(Self, nil); // Return an empty subscription.
|
||||
end;
|
||||
|
||||
procedure TMycNullState.Unsubscribe(Tag: TMycNotifyList<IMycSubscriber>.TTag);
|
||||
begin
|
||||
// Unsubscribing from a null state has no effect.
|
||||
end;
|
||||
|
||||
{ TMycSubscription }
|
||||
@@ -206,17 +207,20 @@ end;
|
||||
|
||||
procedure TMycSubscription.Unsubscribe;
|
||||
begin
|
||||
if Assigned(FState) then
|
||||
begin
|
||||
FState.Unsubscribe(FTag);
|
||||
FTag := nil;
|
||||
FState := nil;
|
||||
end;
|
||||
FState.Unsubscribe(FTag);
|
||||
FState := TMycState.Null;
|
||||
FTag := nil;
|
||||
end;
|
||||
|
||||
function TMycSubscription.GetState: IMycState;
|
||||
begin
|
||||
Result := FState;
|
||||
Result := FState
|
||||
end;
|
||||
|
||||
class operator TMycSubscription.Initialize(out Dest: TMycSubscription);
|
||||
begin
|
||||
Dest.FState := TMycState.Null;
|
||||
Dest.FTag := nil;
|
||||
end;
|
||||
|
||||
{ TMycLatch }
|
||||
@@ -301,7 +305,6 @@ function TMycLatch.Subscribe(const Subscriber: IMycSubscriber): TMycSubscription
|
||||
var
|
||||
alreadySet: Boolean;
|
||||
begin
|
||||
Result.Create(TMycState.Null, nil); // Default to an empty subscription.
|
||||
if not Assigned(Subscriber) then
|
||||
exit;
|
||||
|
||||
@@ -409,7 +412,6 @@ end;
|
||||
|
||||
function TMycDirty.Subscribe(const Subscriber: IMycSubscriber): TMycSubscription;
|
||||
begin
|
||||
Result.Create(TMycState.Null, nil); // Default to an empty subscription
|
||||
if not Assigned(Subscriber) then
|
||||
exit;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user