gpt4 book ai didi

java - 使接口(interface)程序化而不是语义化是什么意思?

转载 作者:太空宇宙 更新时间:2023-11-03 12:49:43 25 4
gpt4 key购买 nike

目前我正在阅读《代码大全,第 2 版》一书。在第 6.2 章中,作者讨论了类和接口(interface)并给出了以下建议:

Make interfaces programmatic rather than semantic when possible
Each interface consists of a programmatic part and a semantic part. The programmatic part consists of the data types and other attributes of the interface that can be enforced by the compiler. The semantic part of the interface consists of the assumptions about how the interface will be used, which cannot be enforced by the compiler. The semantic interface includes considerations such as “RoutineA must be called before RoutineB” or “RoutineA will crash if dataMember1 isn’t initialized before it’s passed to RoutineA.” The semantic interface should be documented in comments, but try to keep interfaces minimally dependent on documentation. Any aspect of an interface that can’t be enforced by the compiler is an aspect that’s likely to be misused. Look for ways to convert semantic interface elements to programmatic interface elements by using Asserts or other techniques.

我理解作者所说的语义和程序化的意思,但我不明白的是如何将语义接口(interface)函数转换为程序化接口(interface)函数。他提到使用断言或其他技术来实现这一点。

以作者为例:

RoutineA 必须在 RoutineB 之前被调用。我假设这些例程是接口(interface)(公共(public)函数)的一部分,因为这就是丑陋的接口(interface)。

因此,如果确实必须在调用 RoutineB 之前调用 RoutineA,您将如何使用断言或其他技术重新组织此接口(interface)?

我对此有一些想法,但我不确定它们是否正确。

假设 RoutineA 和 RoutineB 都是公共(public)函数,这意味着它们应该彼此独立可用,但唯一的限制是您必须先调用 RoutineA,然后才能独立调用 RoutineB。

如果确实是这种情况,那么您将如何使用断言或其他技术解决这个问题?

如果我的假设有错误,欢迎指正。

此外,我特意将其发布在当前标签下,因为像面向对象编程/设计/接口(interface)这样的标签点击率非常低,这意味着我的问题可能不会被很多人看到。

最佳答案

两个可能的答案:

  • assert( a_called ); 放入例程 RoutineB
  • 从类的接口(interface)中删除RoutineB,并使RoutineA返回一个包含RoutineB成员的新对象。

在后一种情况下,您可能希望使外部类成为围绕指向内部类的智能指针的薄包装,然后 RoutineA 将只复制指针。

class Impl;
class SecondClass;
class FirstClass
{
std::shared_ptr<Impl> pimpl;
public:
FirstClass();
SecondClass RoutineA(...);
...
}

class SecondClass
{
std::shared_ptr<Impl> pimpl;
friend class FirstClass;
SecondClass(const std::shared_ptr<Impl>& impl) : pimpl(impl);
public:
void RoutineB(....);
}

SecondClass FirstClass::RoutineA(...)
{
// Do stuff
return SecondClass(pimpl);
}

您也可以使用 unique_ptr 来完成,但该代码有点长。

关于java - 使接口(interface)程序化而不是语义化是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34224983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com