当前位置: 首页 > 知识库问答 >
问题:

Java switch/case方法建议的长度

云卓
2023-03-14

我是一名学生,正在写一篇关于SSL/TLS和JSSE的论文。在oracle提供的实施示例中(可在此处找到:http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#AppA)我找到了实施的例子:

   public void doHandshake(SocketChannel socketChannel,
                        SSLEngine     engine,
                        ByteBuffer    myNetData, 
                        ByteBuffer    peerNetData) throws Exception {

    // 2)
    int appBufferSize = engine.getSession().getApplicationBufferSize();
    // 3)
    ByteBuffer myAppData = ByteBuffer.allocate(appBufferSize);
    ByteBuffer peerAppData = ByteBuffer.allocate(appBufferSize);

    // 4)
    engine.beginHandshake();
    SSLEngineResult.HandshakeStatus hs = engine.getHandshakeStatus();

    // 5)
    while (hs != SSLEngineResult.HandshakeStatus.FINISHED
            && hs != SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING) {

        switch (hs) {

            case NEED_UNWRAP:
                // Receive handshaking data from peer
                if (socketChannel.read(peerNetData) < 0) {
                    // The channel has reached end-of-stream
                }

                // Process incoming handshaking data
                peerNetData.flip();
                SSLEngineResult res = engine.unwrap(peerNetData, peerAppData);
                peerNetData.compact();
                hs = res.getHandshakeStatus();

                // Check status
                switch (res.getStatus()) {
                    case OK:
                        // Handle OK status
                        break;

        // Handle other status: BUFFER_UNDERFLOW, BUFFER_OVERFLOW, CLOSED
                    //...
                }
                break;

            case NEED_WRAP:
                // Empty the local network packet buffer.
                myNetData.clear();

                // Generate handshaking data
                res = engine.wrap(myAppData, myNetData);
                hs = res.getHandshakeStatus();

                // Check status
                switch (res.getStatus()) {
                    case OK:
                        myNetData.flip();

                        // Send the handshaking data to peer
                        while (myNetData.hasRemaining()) {
                            socketChannel.write(myNetData);
                        }
                        break;

        // Handle other status:  BUFFER_OVERFLOW, BUFFER_UNDERFLOW, CLOSED
                    //...
                }
                break;

            case NEED_TASK:
                // Handle blocking tasks
                break;

    // Handle other status:  // FINISHED or NOT_HANDSHAKING
            //...
        }
    }

// Processes after handshaking
    //   ...
}

现在,根据我对正确的OOP体系结构的了解,这个方法不应该超过20行,但我发现Oracle会犯这样的基本体系结构错误是很奇怪的。任何超过20行的都应该被分割成不同的方法,但也有例外。我想知道,这是例外吗?如果没有,将switch/case方法拆分为更小的方法的最佳方法是什么。

共有1个答案

锺星洲
2023-03-14

你在拼凑术语。。。那不一定属于一起。

您可以创建一个伟大的OOP设计...并且在每个方法中仍然有很多代码。

您可以遵循干净的代码规则,例如,避免任何包含多个抽象级别的方法;最终的设计可能很糟糕,“不是OOP”(但我认为:这很难——如果你遵循所有干净的代码规则,你会自动创建更好的OOP设计)。

但是,要回答最初的问题(这实际上是一个糟糕的问题;因为它需要基于意见的答案,比如我的答案):上述代码至少“一点也不干净”。事实上,我觉得这很可怕,而将“更多”塞进enum案例的想法对我来说听起来非常糟糕。除此之外,您将不会以这种方式使用枚举-这种“开关”应该对html" target="_blank">客户端代码不可见;相反,你会依赖多态性;然后简单地告诉你在某个对象上调用某个方法。。。

到现在为止,我已经练习了多年干净的代码,发现生成的代码更易于阅读和维护。在“干净代码”中;如前所述:您不会在一个方法中放入多个switch语句。每个循环;而每一个破绽案例。。。将被放在自己的方法中。

许多人认为这很疯狂,但我发现这确实是“更好”的方法,在实践了几个月之后。它确实阻止了我创建像您的示例那样不可测试的代码。

回答你的第二个问题:这真的很难。人们必须理解整个设计,然后一点一点地把它拆开,重构它的元素。但是这当然需要你有一套完整的单元/功能测试(所以你要证明你的改变不会破坏整个事情)。因此,“改进”此类代码的通用方法是:

  1. 了解更改现有软件的真正成本。你不应该仅仅因为“坏代码”而改变东西。您需要一个好的(业务)理由来证明更改代码的费用。
 类似资料:
  • 我有以下问题: 我已经为安全性创建了注释: 在我具有类之间的继承性的情况下,是否也有可能所有类都具有@Security注释来获得最具体的定义? 约西

  • 在我的应用程序(这是一个Android游戏)中,我有一个方法可以检查玩家是否还活着,如果没有,运行一个动画,游戏就结束了。 根据玩家的输球方式,目前有3种不同的动画可用。 例如,它们可能从屏幕上掉下来,撞到一只鸟,或者被从天上掉下来的东西压扁。每一个都有不同的动画。 基本上,我正在做的是: 当玩家输球时,我设置了它发生的方法,例如,如果他们被鸟击中: 然后我通过在我的check Gameover(

  • 我最近使用py魅力和sonarqube来审查我的代码。这两个工具都建议更新很多方法,例如,它们的主体中没有使用,而是使用装饰器。 我完全理解为什么,但我觉得它几乎毫无意义。关于性能,我不确定它会有那么大的帮助。此外,这些通常是被覆盖的django方法。我可以安全地使用那个装饰器吗?或者它毫无意义,不值得花时间更新?

  • 问题内容: 我收到“ 查找错误” 错误- 调用静态java.text.DateFormat方法, 并且我不知道为什么在下面做这些事情不好/不建议这样做的原因。 问题答案: DateFormat不是线程安全的,这意味着它们维护状态的内部表示。如果多个线程同时访问同一实例,则在静态上下文中使用它们会产生一些非常奇怪的错误。 我的建议是使变量在使用变量的位置本地化,而不是使它们成为类的静态属性。初始化类

  • 我写了一个关于梅琳达·格林的Buddhabrot方法的变体,用于可视化曼德尔布罗特集。这是: http://pastebin.com/RH6dD77F 为了制作一个动画,我渲染了数百张略有变化的单独图像。这种变化是生成函数的系数的变换,就好像它们是系数空间中的抽象向量一样。所有这些都在视频中产生了不可思议的结构... http://www.youtube.com/watch?v=S2uMAvL_5

  • 一些日志记录需要在类的静态方法执行前后完成。我试图使用Spring AOP实现这一点,但它不起作用,对于普通方法来说,它是起作用的。请帮助我理解如何实现这一点,如果可以使用注释来完成,那就太好了。