Oop 如何消除流逻辑的重复?
我有一个服务/管理器类,我在其中从数据源获取用户。这些方法都在流中,但具有不同的检索方法Oop 如何消除流逻辑的重复?,oop,design-patterns,Oop,Design Patterns,我有一个服务/管理器类,我在其中从数据源获取用户。这些方法都在流中,但具有不同的检索方法 public User GetByUserName(string userName) { user = dependencyResolver.UserRepository.GetByUserName(userName); if (user == null) return null; AddStuffToUser(); re
public User GetByUserName(string userName)
{
user = dependencyResolver.UserRepository.GetByUserName(userName);
if (user == null) return null;
AddStuffToUser();
return user;
}
public User GetById(int id)
{
user = dependencyResolver.UserRepository.GetById(id);
if (user == null) return null;
AddStuffToUser();
return user;
}
public User GetByUserName(string userName, string encryptedPassword)
{
user = dependencyResolver.UserRepository.GetByUsernameAndPassword(userName, encryptedPassword);
if (user == null) return null;
AddStuffToUser();
return user;
}
我想消除流逻辑的重复,但我找不到令人满意的设计。我可以通过使用OOP来完成,但我认为这样一个简单的任务会增加很多复杂性。我还尝试将fetch方法作为Func参数传递,但由于fetch方法具有不同的参数,所以没有正确地传递
我的选择是什么 替换:
if (user == null) return null;
AddStuffToUser();
return user;
与:
并加上:
private User doXYZ(User user){
if (user != null){
AddStuffToUser();
return user;}
return null;
此时,u为9放置了6行,其更好的代码样式OOP标准在任何任务中都是有用的我一直读到这一行:user=dependencyResolver.UserRepository.GetByUserNameuserName;在那里你违反了德米特的法律。首先修正一句有趣的话@AlmaDo。dependencyReslover仅返回存储库接口。我可以编写IUserRepository userRepository=dependencysolver.userRepository;userRepository.GetByUserNameuserName;dependencyResolver被传递给服务的构造函数。我明白我不应该信任朋友的朋友,但dependencyResolver和UserRepository更像是兄弟而不是朋友。我能把一个兄弟交给一个朋友吗?还是这仍然违反了德米特的法律?我相信你想做的是封装一个秘密。请注意,此时您实际上正在脱离OOP领域,进入AOP。感谢您的回复。这个问题中的例子很简单,正如你所建议的,可以重构。但我正在寻找一种更通用的解决方案,用于消除流逻辑的重复。
private User doXYZ(User user){
if (user != null){
AddStuffToUser();
return user;}
return null;