2014-02-28 1 views
1

Я занимаюсь школьным проектом, который состоит из клиент-серверной игры.Несколько методов или один (но длинный) метод

Java код может быть записан, как показано в примере 1 и пример 2:

В примере 2, я вижу возможность сократить конструктор путем создания 3 частных методов и вызова их внутри конструктор (что ИМХО выглядит намного опрятно).

Какой пример наилучшей практики/рекомендуется на 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

найти баланс между производительностью и понятностью. Я считаю, что небольшие атомные методы легче поддерживать, а другим - понимать. Другими словами, мне нравится вариант 2 – markg

+0

Я бы значительно ошибся в понимании и ремонтопригодности. – aliteralmind

+0

Также обратите внимание, что в случае исключения ваш объект будет инициализирован в недопустимом состоянии. – xp500

ответ

2

Пример 2 будет вашим лучшим выбором, потому что это следует руководящих принципов наилучшей практики, что легче читать и в свою очередь, это делает ваш код чище. Идеально также превратить фрагменты кода в метод, имя которого объясняет цель метода. Есть несколько причин, почему вы хотели бы короткие, хорошо названные методы:

  1. Во-первых, это повышает вероятность того, что другие методы могут использовать метод, когда метод мелкозернистой.

  2. Во-вторых, это позволяет более высокоуровневым методам больше походить на ряд комментариев. Переопределение также проще, когда методы мелкозернистые.

Возьмем, к примеру Мартин Фаулер дает в своем блоге:

Fragmented код:

void printOwing() { 
    printBanner(); 

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

Refactored код:

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

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

Это также помогает другим людям кто мигрирует Просмотрите свой код, чтобы быстро понять, что происходит.

Вы можете узнать больше о блоге мистера Фаулера по телефону Refactoring. Также см. Блог SourceMaking о том, почему вы должны извлекать свои методы.

0

Обычно, если это действительно не оправдано, руководство должно попытаться разделить любые ваши функции, имеющие более 100 LOC.Случаи, когда это оправдано, включают

  1. Это требование производительности сверхвысокой на этой функции
  2. Это расщепление результат в много передачи параметров и выглядит излишним
  3. Это функция логически одна часть операции

И т.д.

Смежные вопросы