3

如果我有这样的服务器接口......

interface IServer
{
    void Login();
    void Post();
    void Get();
}

......除非你先完成,否则不要Post工作。它是否违反了封装的语义,因为它使您对接口的使用隐含地依赖于实现?你会如何解决它?GetLogin

4

2 回答 2

10

我的想法:

interface IServer 
{
    ISession Authenticate();
}

interface ISession 
{
    IServer Server{get;}
    void Post();
    void Get();
}

忽略,如果你是可访问的“泥”:

[泥]

为了澄清这一点:恕我直言,您必须像创建产品一样考虑软件设计……您真的想要一个保险箱来存放您所有有价值的东西,您可以按下按钮“打开”而不是首先在上面输入代码吗?这只是您的用例的类比...

实施者可以在验证之前调用 post 并获取...

另一种广泛使用的方法是访问令牌和它的使用,如下所示:'

interface IServer{ // 返回所需的令牌字符串 Authenticate(); 无效帖子(字符串令牌);无效获取(字符串令牌);}

但我认为,这也是错误的......

你可以看到并且可能调用方法,在登录之前你不能看到/调用这些方法......如果实现者只是不检查“令牌”是否正确,那么你在这里有安全风险......

如果您将逻辑分为几层(访客/未经身份验证、经过身份验证/会话和(例如)管理会话),您将获得清晰的逻辑分离和更多的语义有用性......

我个人编写代码的方式是好的框架构建者会编写代码......它具有可重用性,即使经过多年,也非常容易和清晰。

[/泥]

于 2012-08-27T16:34:45.193 回答
6

C# 中的接口只是确保某些属性(存在方法)的正式合同。它没有捕获开发人员想到的完整语义契约。从这个意义上说,使用接口永远不能保证调用者可以调用他想要的任何方法

这同样适用于任何方法,例如File.WriteAllText(path, text). 即使正式接口允许,您也不能只传入 null 作为路径。记录在案的、强制执行的运行时合同会阻止您这样做。

回到你的代码:调用者不依赖于接口的实现。他依赖于它的合同(在 C# 中没有说明)。

于 2012-08-27T16:35:17.317 回答