【发布时间】:2022-06-10 18:57:11
【问题描述】:
我有两个类如下:
public async A GernerateStuff(int expireDays = 15)
{
using var randomNumberGenerator = RandomNumberGenerator.Create();
var randomBytes = new byte[64];
var now = DateTime.UtcNow;
randomNumberGenerator.GetBytes(randomBytes);
return new A
{
Stuff = Convert.ToBase64String(randomBytes),
Created = now,
Expires = now.AddDays(expireDays)
};
}
public async B GernerateStuff(int expireDays = 10)
{
using var randomNumberGenerator = RandomNumberGenerator.Create();
var randomBytes = new byte[64];
var now = DateTime.UtcNow;
randomNumberGenerator.GetBytes(randomBytes);
return new B
{
Stuff = Convert.ToBase64String(randomBytes),
Created = now,
Expires = now.AddDays(expireDays)
};
}
public class A
{
public string Stuff{ get; set; }
public DateTime Created { get; set; }
public DateTime Expires { get; set; }
}
public class B
{
public string Stuff{ get; set; }
public DateTime Created { get; set; }
public DateTime Expires { get; set; }
}
限制是:我不能只创建一个类而不是两个单独的类 A 和 B,因为它们在用法上有很大差异。
现在,我的问题是:我如何清理这段代码,同时拥有 A 类和 B 类,但 GernerateStuff 的单一方法?
我可以创建这样的界面:
public class A : IInterface
{
}
public class B : IInterface
{
}
public interface IInterface
{
public string Stuff{ get; set; }
public DateTime Created { get; set; }
public DateTime Expires { get; set; }
}
那么,问题是public async IInterface GernerateStuff(int expireDays = 15) 签名如何处理 A 类和 B 类?
【问题讨论】:
-
我试图这样做,但是对于公共异步 IInterface GernerateStuff(int expireDays = 15) 签名,我将如何返回一个可以同时处理 A 类和 B 类的接口类型?
-
只用一个,完全一样。不要过度设计。
-
考虑一下,您的方法可以移动到静态类,因为它似乎不依赖于 A 或 B 的任何实例级别信息。然后您可以将其设为通用方法,即 T GenerateStuff
(int expireDays) -
是的,我同意@PabloCaballero。不要过度设计它。
-
我不同意 Pablo Caballero 和 Francis Decena 的观点。分离类型不是过度工程。这可能有很好的理由,例如未来的变化是可以预料的。
标签: c# oop refactoring