这是一个语义违反封装的例子,如果是这样,我该如何解决?

时间:2012-08-27 16:32:32

标签: c# encapsulation

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

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

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

2 个答案:

答案 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#中没有说明)。