gpt4 book ai didi

java - 多种方法或一种(但很长)方法

转载 作者:行者123 更新时间:2023-11-30 04:00:38 25 4
gpt4 key购买 nike

我正在做一个学校项目,其中包含客户端服务器游戏。

Java 代码可以像示例 1示例 2 中演示的那样编写:

示例 2 中,我看到可以通过创建 3 个私有(private)方法并在构造函数内调用它们来缩短构造函数(恕我直言,这看起来更简洁)。

哪个示例是 Java 中的最佳实践/推荐?

示例 1:

public ServerConnection()
{
private Socket serverSocket = null;
private SSLSocket sslServerSocket = null;

private DataOutputStream dos;
private DataInputStream dis;
private ObjectOutputStream oos;
private ObjectInputStream ois;

private DataOutputStream ssldos;
private DataInputStream ssldis;
private ObjectOutputStream ssloos;
private ObjectInputStream sslois;

try
{
serverSocket = new Socket("localhost", 9000);

String password = "password";

KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(ClassLoader.getSystemResourceAsStream("SSL/mykey.jks"), password.toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
trustManagerFactory.init(trustStore);

SSLContext context = SSLContext.getInstance("TLS");
context.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());

SSLSocketFactory sslSocketFactory = (SSLSocketFactory)context.getSocketFactory();
sslServerSocket = (SSLSocket) sslSocketFactory.createSocket("localhost", 9001);

sslServerSocket.startHandshake();


dos = new DataOutputStream(serverSocket.getOutputStream());
dis = new DataInputStream(serverSocket.getInputStream());
oos = new ObjectOutputStream(serverSocket.getOutputStream());
ois = new ObjectInputStream(serverSocket.getInputStream());

ssldos = new DataOutputStream(sslServerSocket.getOutputStream());
ssldis = new DataInputStream(sslServerSocket.getInputStream());
ssloos = new ObjectOutputStream(sslServerSocket.getOutputStream());
sslois = new ObjectInputStream(sslServerSocket.getInputStream());

}
catch (IOException | KeyStoreException | NoSuchAlgorithmException | CertificateException | KeyManagementException e)
{
System.out.println("ServerConnection 2 " + e.getMessage());
}
}

示例 2:

public ServerConnection()
{
private Socket serverSocket = null;
private SSLSocket sslServerSocket = null;

private DataOutputStream dos;
private DataInputStream dis;
private ObjectOutputStream oos;
private ObjectInputStream ois;

private DataOutputStream ssldos;
private DataInputStream ssldis;
private ObjectOutputStream ssloos;
private ObjectInputStream sslois;

try
{
serverSocket = new Socket("localhost", 9000);

keyMethod();

SSLContext context = SSLContext.getInstance("TLS");
context.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
SSLSocketFactory sslSocketFactory = (SSLSocketFactory)context.getSocketFactory();
sslServerSocket = (SSLSocket) sslSocketFactory.createSocket("localhost", 9001);
sslServerSocket.startHandshake();

setStreams();

setSSLStreams();
}
catch (IOException | KeyStoreException | NoSuchAlgorithmException | CertificateException | KeyManagementException e)
{
System.out.println("ServerConnection 2 " + e.getMessage());
}

private void keyMethod()
{
String password = "password";
KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(ClassLoader.getSystemResourceAsStream("SSL/mykey.jks"), password.toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
trustManagerFactory.init(trustStore);
}

private void setStreams()
{
dos = new DataOutputStream(serverSocket.getOutputStream());
dis = new DataInputStream(serverSocket.getInputStream());
oos = new ObjectOutputStream(serverSocket.getOutputStream());
ois = new ObjectInputStream(serverSocket.getInputStream());
}

private void setSSLStreams()
{
ssldos = new DataOutputStream(sslServerSocket.getOutputStream());
ssldis = new DataInputStream(sslServerSocket.getInputStream());
ssloos = new ObjectOutputStream(sslServerSocket.getOutputStream());
sslois = new ObjectInputStream(sslServerSocket.getInputStream());
}
}

最佳答案

示例 2 将是您的最佳选择,因为它遵循最佳实践指南,更易于阅读,进而使您的代码更加清晰。将代码片段转换为一个方法(其名称解释了该方法的用途)也是理想的选择。您需要简短且命名良好的方法有几个原因:

  1. 首先,当方法细粒度时,它增加了其他方法可以使用该方法的机会。

  2. 其次,它允许更高级别的方法更像一系列注释。当方法细粒度时,覆盖也更容易。

以 Martin Fowler 在他的博客上给出的例子:

代码碎片:

void printOwing() {
printBanner();

//print details
System.out.println ("name: " + _name);
System.out.println ("amount " + getOutstanding());
}

重构代码:

void printOwing() {
printBanner();
printDetails(getOutstanding());
}

void printDetails (double outstanding) {
System.out.println ("name: " + _name);
System.out.println ("amount " + outstanding);
}

这还可以帮助其他可能查看您代码的人快速了解发生了什么。

您可以查看 Fowler 先生的更多博客:Refactoring 。另请参阅SourceMaking关于为什么应该提取方法的博客。

关于java - 多种方法或一种(但很长)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22084735/

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