如果我有像这样的服务器接口......
interface IServer
{
void Login();
void Post();
void Get();
}
...除非您先完成Post
,否则Get
和Login
不起作用。它是否是对封装的语义违反,因为它使得您对接口的使用隐含地依赖于实现?你会如何解决它?
答案 0 :(得分:10)
我的想法:
interface IServer
{
ISession Authenticate();
}
interface ISession
{
IServer Server{get;}
void Post();
void Get();
}
如果您可以接触“泥”,请忽略:
[MUD]
澄清一下:imho你必须像你一样考虑软件设计 会创造一个产品...你真的想要一个安全的所有你 有价值的东西,你可以按下“打开”按钮而不是FIRST 输入代码吗?这只是你用例的类比......
执行者可以在验证之前调用post并获取...
另一种广泛使用的方法是访问令牌及其使用方式 这里:“
interface IServer {//返回所需的令牌字符串 认证(); void Post(字符串标记); void Get(string token); }
但我认为,那也是错的......
您可以看到并且可能会调用您不允许的方法 登录前看到/调用...如果执行者不检查是否 “令牌”是正确的,你在这里有安全隐患......
如果将逻辑划分为多个层(guest / unauthenticated, 认证/会话,和(例如)adminsession)你得到干净 逻辑分离和更多语义上的有用性......
我个人编写代码EVER,好的框架构建器会编写代码......它具有可重用性,即使经过多年,也非常 简单明了。
[/ MUD]
答案 1 :(得分:6)
C#中的接口只是一个确保某些属性(方法的存在)的正式合同。它没有捕获开发人员想到的完整语义合约。从这个意义上说,使用接口永远不会保证调用者可以调用他想要的任何方法。
File.WriteAllText(path, text)
等任何方法都是如此。即使正式接口允许,也不能只传入null作为路径。记录在案的强制运行时合同会阻止您这样做。
返回您的代码:调用者不依赖于接口的实现。他取决于合同(C#中没有说明)。