如果我有这样的服务器接口......
interface IServer
{
void Login();
void Post();
void Get();
}
......除非你先完成,否则不要Post
工作。它是否违反了封装的语义,因为它使您对接口的使用隐含地依赖于实现?你会如何解决它?Get
Login
如果我有这样的服务器接口......
interface IServer
{
void Login();
void Post();
void Get();
}
......除非你先完成,否则不要Post
工作。它是否违反了封装的语义,因为它使您对接口的使用隐含地依赖于实现?你会如何解决它?Get
Login
我的想法:
interface IServer
{
ISession Authenticate();
}
interface ISession
{
IServer Server{get;}
void Post();
void Get();
}
忽略,如果你是可访问的“泥”:
[泥]
为了澄清这一点:恕我直言,您必须像创建产品一样考虑软件设计……您真的想要一个保险箱来存放您所有有价值的东西,您可以按下按钮“打开”而不是首先在上面输入代码吗?这只是您的用例的类比...
实施者可以在验证之前调用 post 并获取...
另一种广泛使用的方法是访问令牌和它的使用,如下所示:'
interface IServer{ // 返回所需的令牌字符串 Authenticate(); 无效帖子(字符串令牌);无效获取(字符串令牌);}
但我认为,这也是错误的......
你可以看到并且可能调用方法,在登录之前你不能看到/调用这些方法......如果实现者只是不检查“令牌”是否正确,那么你在这里有安全风险......
如果您将逻辑分为几层(访客/未经身份验证、经过身份验证/会话和(例如)管理会话),您将获得清晰的逻辑分离和更多的语义有用性......
我个人编写代码的方式是好的框架构建者会编写代码......它具有可重用性,即使经过多年,也非常容易和清晰。
[/泥]
C# 中的接口只是确保某些属性(存在方法)的正式合同。它没有捕获开发人员想到的完整语义契约。从这个意义上说,使用接口永远不能保证调用者可以调用他想要的任何方法。
这同样适用于任何方法,例如File.WriteAllText(path, text)
. 即使正式接口允许,您也不能只传入 null 作为路径。记录在案的、强制执行的运行时合同会阻止您这样做。
回到你的代码:调用者不依赖于接口的实现。他依赖于它的合同(在 C# 中没有说明)。