2016-02-10 6 views
3

Я вполне уверен, что я не правильно отношусь к классу.Неправильное использование Java-класса - наилучшая практика

Я использую класс для создания набора переменных (например, тип объекта javascript, возможно, но не совсем).

Я использую его, как показано ниже (основной пример)

public class myScript { 

    public static void main(String[] args) { 

     Client warehouse   = new Client(); 
     Contacts warehouseContactsA = new Contacts(); 
     Contacts warehouseContactsB = new Contacts(); 

     warehouse.idno = 1; 
     warehouse.name = "warehouse"; 
     warehouse.desc = "I don't exist"; 

     warehouseContactsA.client_idno = 1; 
     warehouseContactsA.email  = "[email protected]" 

     warehouseContactsB.client_idno = 1; 
     warehouseContactsB.email  = "[email protected]"    

     insertIntoDB(warehouse, 
        warehouseContactsA, 
        warehouseContactsB); 

    } 

    public static void insertIntoDB(Client warehouse, 
            Contacts warehouseContactsA, 
            Contacts warehouseContactsB) { 

     // code to insert into database here 

    } 

    private class Client { 
     int  idno; 
     String name; 
     String desc; 
    } 

    private class Contacts { 
     int  client_idno; 
     String email; 
    } 

} 

Есть ли причина, чтобы не использовать классы таким образом, и если да, то есть более простой способ для хранения/управления данными, не требуется класс?

+0

Да, вы могли бы использовать более объектно-ориентированную парадигму. –

+0

Вы можете добавить Контакты в свой клиент (например, как массив), так как контакт всегда связан с клиентом. Также, как отметил @Nathan, вы можете захотеть объявить свои объекты в дополнительном классе (вы можете захотеть использовать их снова, и они не сильно связаны с вашим скриптом). – ctst

+0

Есть много мест, которые можно было бы улучшить и улучшить код. – MaxZoom

ответ

2

Создание внутренних классов, вероятно, создаст для вас подводные камни. Если вы не определяете их как статические, то им требуется неявная ссылка обратно на внешний класс, который не нужен вашему коду, он будет только мешать и вызвать неясные ошибки. Может быть, вы делаете это, чтобы компилировать только один класс и избегать создания сценария сборки? Простые скрипты сборки, которые используют gradle, тривиальны (не так, как в старые добрые времена, когда мы использовали ant), так что это не должно быть проблемой. Было бы лучше перенести ваши постоянные объекты в отдельные файлы.

Что вы делаете с подключениями к базе данных и транзакциями, неясно. Как правило, плохо пытаться делать каждую вставку в своей собственной транзакции, хотя бы потому, что у каждой транзакции есть накладные расходы, и это увеличивает время, в которое должны запускаться вставки. Как правило, вы хотите обрабатывать вставки в пакетах.

В основном, однако, если вы пишете скрипт, используйте язык сценариев. Groovy может быть хорошим выбором здесь:

  • вам не нужен внешний класс для процедурной части сценария
  • вы можете определить несколько общедоступных классов в одном файле
  • Groovy включает в себя groovy.sql API для упрощая JDBC-код.
0

Да, это достаточно хорошее представление.

Нет, это не идеально. Есть несколько вещей, которые вы можете изменить, чтобы улучшить ситуацию:

вариант Видимости 1: сделать вещи наедине с аксессорами

Вы можете сделать вещи более ОО-идиоматическим, имея свой «боб» классы (т.е. объекты с целью хранения данных только, никакой логики) не поля частных, а затем с общественностью аксессоров маскировать внутреннее представление:

public class Client { 
    private int id; 
    public int getId() { return this.id; } 
    public void setId(int id) { this.id = id; } 
} 

вариант Видимость 2: сделать ваши бобы неизменны

Другим вариантом является сделать так, чтобы ваши компоненты были неизменными (чтобы вы могли без проблем передавать их в многопоточной среде), а также гарантировать, что они правильно инициализированы, и никто не пишет им в незаконном состоянии (например, удаление/обнуления идентификатор, но не остальные данные):

public class Client { 
    public final int id; 
    public Client(int id) { this.id = id; } 
} 

Наконец, если у вас есть вещи, которые могут или не могут быть там (например, описание «Я не существую») , Я рекомендую использовать необязательные типы, а не только типы строк.

+0

С точки зрения удобства использования (и многих других концепций ООП) это недопустимый код. – MaxZoom

+0

@MaxZoom Ухаживать за тем, почему? –

+0

Давайте рассмотрим событие реального мира, которое происходит все время: клиент слился с другим клиентом. Теперь его 'id' и' name' изменились, но 'description' и' contacts' остались прежними. Как код будет обрабатывать это изменение? – MaxZoom

0

Я бы использовал Map<String,String> для хранения атрибутов. Где я буду хранить String и ints в качестве Strings и проанализировать их обратно, когда они понадобятся.

надеюсь, что это помогает

1
import java.util.Arrays; 
import java.util.List; 

public final class WarehouseRepository { 

    public static void main(String[] args) { 

     WarehouseRepository repository = new WarehouseRepository(); 

     Client warehouse = new Client(1, "warehouse", "I don't exist"); 
     Contacts warehouseContactsA = new Contacts(1, "[email protected]"); 
     Contacts warehouseContactsB = new Contacts(1, "[email protected]"); 

     repository.insertIntoDB(warehouse, Arrays.asList(warehouseContactsA, warehouseContactsB)); 
    } 

    public void insertIntoDB(Client warehouse, List<Contacts> contacts) { 
     // code to insert into database here 
    } 
} 

final class Client { 
    private final int id; 
    private final String name; 
    private final String desc; 

    public Client(int id, String name, String desc) { 
     this.id = id; 
     this.name = name; 
     this.desc = desc; 
    } 

    public int getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getDesc() { 
     return desc; 
    } 
} 

final class Contacts { 
    private final int clientName; 
    private final String email; 

    public Contacts(int clientName, String email) { 
     this.clientName = clientName; 
     this.email = email; 
    } 

    public int getClientName() { 
     return clientName; 
    } 

    public String getEmail() { 
     return email; 
    } 
} 

Некоторые вещи, чтобы заметить:

  1. Попробуйте назвать классы с их намерениями и некоторых Java конвенций. Например, класс, выполняющий операции с базой данных, обычно упоминается как repository
  2. Если не требуется, сделайте классы и переменные окончательными.
  3. Сделать поля конфиденциальными, и если они должны быть, тогда сделайте им параметры конструктора, а не публичные или геттер/сеттеры.
  4. Если с клиентом может быть несколько контактов, тогда было бы неплохо сделать List<Contact> как поле в клиенте.

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

  • Нет связанных вопросов^_^