From 92c526140038d15505c23d807e1ff5ca76e91e9c Mon Sep 17 00:00:00 2001 From: "Collin M. Barrett" Date: Sun, 15 Nov 2020 13:03:21 -0600 Subject: [PATCH] =?UTF-8?q?refactor(archival):=20=E2=99=BB=20update=20Valu?= =?UTF-8?q?eObject=20impl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SeedWork/ValueObject.cs | 48 ++++++++++++------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/services/Archival/FilterLists.Archival.Domain/SeedWork/ValueObject.cs b/services/Archival/FilterLists.Archival.Domain/SeedWork/ValueObject.cs index 52119af79..832b2d412 100644 --- a/services/Archival/FilterLists.Archival.Domain/SeedWork/ValueObject.cs +++ b/services/Archival/FilterLists.Archival.Domain/SeedWork/ValueObject.cs @@ -3,42 +3,58 @@ namespace FilterLists.Archival.Domain.SeedWork { + /// https://enterprisecraftsmanship.com/posts/value-object-better-implementation/ public abstract class ValueObject { - protected static bool EqualOperator(ValueObject left, ValueObject right) - { - return left.Equals(right); - } - - protected static bool NotEqualOperator(ValueObject left, ValueObject right) - { - return !EqualOperator(left, right); - } - protected abstract IEnumerable GetEqualityComponents(); public override bool Equals(object? obj) { - if (obj is null) + if (obj == null) { return false; } - if (obj.GetType() != GetType()) + if (GetType() != obj.GetType()) { return false; } - var other = (ValueObject)obj; + var valueObject = (ValueObject)obj; - return GetEqualityComponents().SequenceEqual(other.GetEqualityComponents()); + return GetEqualityComponents().SequenceEqual(valueObject.GetEqualityComponents()); } public override int GetHashCode() { return GetEqualityComponents() - .Select(x => x?.GetHashCode() ?? 0) - .Aggregate((x, y) => x ^ y); + .Aggregate(1, (current, obj) => + { + unchecked + { + return (current * 23) + (obj?.GetHashCode() ?? 0); + } + }); + } + + public static bool operator ==(ValueObject? a, ValueObject? b) + { + if (ReferenceEquals(a, null) && ReferenceEquals(b, null)) + { + return true; + } + + if (ReferenceEquals(a, null) || ReferenceEquals(b, null)) + { + return false; + } + + return a.Equals(b); + } + + public static bool operator !=(ValueObject? a, ValueObject? b) + { + return !(a == b); } } }