首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java开关/case方法报告长度

Java开关/case方法报告长度
EN

Stack Overflow用户
提问于 2016-05-03 11:22:16
回答 3查看 703关注 0票数 2

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

代码语言:javascript
复制
   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行的都应该被分割成单独的方法,但是也有例外。我想知道,这是其中一个例外吗?如果没有,那么将开关/case方法拆分为更小的方法的最佳方法是什么。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-03 11:31:45

你在编条件..。不一定属于一起的人。

你可以创造一个伟大的OOP设计..。在每个方法中仍然有大量的代码。

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

但是,要回答原来的问题(这实际上是一个糟糕的问题;因为它邀请了基于意见的答案,比如我的问题):上面的代码至少“一点也不干净”。实际上,我觉得这很可怕,把“更多”的东西塞进那些“更多”的案子里听起来太糟糕了。除此之外,您不会以这种方式使用枚举--这种“开关”应该使客户端代码不可见;相反,您将依赖于多态;只需告诉调用某个对象上的某个方法.

我已经练习了多年的清洁代码,并发现产生的代码是更好的阅读和维护。在“干净代码”中;好的,正如所述:您不会将多个switch语句放入一个方法中。每一个循环;和每一个破案.都会用自己的方法。

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

然后回答你的第二个问题:这真的很难。一个人将不得不理解整个设计,然后,一片片,撕开它,并重构它的元素。但是,这当然要求您有一套完整的单元/功能测试(因此您可以看到您的更改并没有破坏整个过程)。因此,“改进”这类代码的通用方法是:

  1. 了解更改现有软件的真正成本。你不应该仅仅因为“坏代码”而改变东西。您需要一个很好的(业务)理由来证明更改代码的费用是合理的。
  2. 确保你有好的测试。如果存在测试,请度量它们的覆盖范围(以评估现有测试的“好”程度)。如果没有测试..。开始写吧。
  3. 当测试完成后..。开始重新设计,重新考虑,并扔掉无法挽救的部分。
票数 3
EN

Stack Overflow用户

发布于 2016-05-03 11:39:43

示例代码就是:示例代码。这不是一个实用的软件,它只是一个教育工具,就像一个切线图。它的唯一目的是展示某件东西是如何工作的,而且通常它将以一些您不会将其放入生产代码中的特性为特色。

示例代码的一个典型特性是放弃封装,减少间接方向的数量,这样事情就更本地化了,您可以自上而下地阅读代码,就像一页文本。

这就是您在这里看到的:他们试图一步一步地演示代码,因此他们格式化代码的方式是,每一步都遵循代码中的另一步。

票数 0
EN

Stack Overflow用户

发布于 2016-05-03 12:20:35

Java最未充分使用的特性之一是向枚举中添加行为(例如方法)的可能性。因此,问问自己,你的例子中所需要的行为是否足够普遍,可以由枚举本身执行(全部还是部分)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37002751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档