问题描述
我目前是“清洁代码”和SOLID原理的新话题。
我们为特定任务写了if let boards = self.boards {
let model = boards[indexPath.row]
cell.txtTitle.text = model.b_title
cell.txtUserId.text = model.userId
cell.txtConut.text = String(model.b_count ?? 0)
cell.txtSaveTime.text = String(model.b_date ?? 0)
cell.txtComment.text = String(model.commentCount ?? 0)
}
。
UseCase
据我所知,SOLID应该打开一个解决方案/类/方法进行扩展,关闭以进行更改(打开/关闭原理)。现在的问题是,我们创建了一个不确定的通用using BusinessLogic.Classes.BusinessLogic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BusinessLogic.UseCases
{
public class DoASpecificTask<T> : Interfaces.IUseCase
where T : Interfaces.Connections.IQuery
{
T _Query;
Interfaces.Connections.IConnection<T> _Connection;
object _Parameters;
string _ServiceName;
Interfaces.ISendMessage _MessageSender;
public DoASpecificTask(T query,Interfaces.Connections.IConnection<T> connection,object parameters,string serviceName,Interfaces.ISendMessage messageSender)
{
_Query = query;
_Connection = connection;
_Parameters = parameters;
_ServiceName = serviceName;
_MessageSender = messageSender;
}
public void Execute()
{
Interfaces.Connections.IQueryResultList resultList = ExecuteReadDataOnConnection<T>.GetList(_Query,_Connection,_Parameters);
if (!ValidateQueryResultListItems.Validate(resultList))
{
EndImp3Service.EndService(_ServiceName);
_MessageSender.SendMessage('Message','[email protected]');
}
}
}
}
来发送消息
interface
:
Interfaces.ISendMessage
实际上,我们希望通过电子邮件发送消息,因此我们创建了另一个实现using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BusinessLogic.Interfaces
{
public interface ISendMessage
{
void SendMessage(string message,string recipient);
}
}
的接口ISendEmail
。电子邮件还具有参数ISendMessage
,该参数未在常规界面subject
中实现(方法ISendMessage
)。
SendMessage()
现在我的问题是,我们如何在using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BusinessLogic.Interfaces
{
public interface ISendEmail : ISendMessage
{
void SendMessage(string message,string recipient,string subject);
}
}
中保持开放性以待扩展?可能是在某个时候,我们想要发送WhatsApp或Telegram消息而不是电子邮件。如果我在UseCase
中实现ISendMessage
的属性,则没有参数UseCase
。
我是说subject
中的这一行:
UseCase
由于我们指定了通用接口_MessageSender.SendMessage('Message','[email protected]');
,因此无法在方法中提供ISendMessage
。如果将subject
更改为ISendMessage
,我们将不再开放,不是吗?
这怎么办?还是我们误解了一些完全错误的东西?
更新
首先,感谢您的评论和解决方案。我认为,这确实是问题,作为SOLID的初学者,我们需要了解何时具体化,而不是试图制作一个在任何情况下都可以执行任何操作的程序。当然,SOLID并不意味着根本不需要更改任何代码,而是问题是在哪里需要更改代码。
我认为,在所有提供的解决方案中,问题都只是转移了。无论如何,我都需要指定在ISendEmail
中使用的确切类型。如果要使用@Martin Verjans的解决方案,则可以使用类型UseCase
,但必须在参数中指定具体的类型。通过使用IMessage
,我有同样的问题。 @SomeBody的解决方案不符合开放/封闭原则。
我们的目标是实现在generics
中不明确,因此,如果我们决定发送WhatsApp消息而不是电子邮件,则无需更改UseCase
本身。实际上,我看不到任何选择。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)