2015-12-23 3 views
0

Я создаю программу для тестирования веб-сайта. У сайта есть процесс регистрации, который я тестирую.Не могли бы вы объяснить мне одну путаницу ООП?

Я создал класс с именем «Клиент», который должен хранить информацию о клиенте (имя, фамилия, адрес электронной почты и т. Д.).

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

Очевидно, что я должен создать метод «generateName()».

Но вопрос в том, в каком классе я должен его создать?

Множество программистов создадут метод в классе Client. И будет делать что-то вроде этого:

client = new Client(); 
client.generateName(); 

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

Основываясь на этой информации, я следующим образом:

class Program 
{ 
    private void generateName(); 
} 
... 
class Client 
{ 
... 
    public void name (String name) 
    { 
     this.name = name; 
    } 
} 

program = new Program(); 
program.launch(); 

client = new Client(); 
client.name (program.generateName()); 

Но я знаю, этот подход не используется разработчиками.

Не могли бы вы пояснить, как узнать «что правильно и что не так» здесь? И какой источник информации я должен использовать как произвольное для подобных случаев?

ответ

0

Это звучит как generateName() может быть статическим методом в Client, так как это зависит от случаев:

class Client { 
    private String name; 

    public Client(String name) { 
     this.name = name; 
    } 

    public static String generateRandomName() { 
     String generatedName = ...; 

     return generatedName; 
    } 
} 

Вы могли просто передать это значение объекту клиента, как вы в настоящее время, или с помощью конструктора:

client = new Client(Client.generateRandomName()); 

в противном случае, я бы предложил ClientNameGenerator обрабатывать поколения имя, чтобы сохранить инлайн с SRP и поднять cohesion. Это было бы лучшим выбором, видя, как вы можете быть необходимости более методов генерации имен в будущем:

class ClientNameGenerator { 
    public String generateRandomName() { 
     String generatedName = ...; 
     return generatedName; 
    } 

    //other name generation methods... 
} 

Теперь вы можете использовать ClientNameGenerator объект для управления генерацией имен клиентов:

ClientNameGenerator nameGenerator = new ClientNameGenerator(); 

client = new Client(nameGenerator.generateRandomName()); 

В любое время, когда вам нужно сгенерировать имя, просто используйте созданный объект ClientNameGenerator.

0

Существует несколько мест, которые могут быть подходящими для этой функции.

Вы можете использовать его как частный метод класса Client, используемый статическим заводским методом для генерации клиентов со случайным именем.

public class Client { 
    .... 

    public static Client randomlyNamed() { 
     return new Client(randomName()); 
    } 

    private static String randomName() { 
     return ...; 
    } 
} 

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

public class Client { 
    private static final int defaultNameLength = 8; 
    .... 

    public static Client randomlyNamed() { 
     return new Client(Strings.randomString(defaultNameLength)); 
    } 
} 

public class Strings 
    private static String randomString(int length) { 
     return ...; 
    } 
} 

Затем можно расширить статический метод в общий класс цели ClientBuilder, с помощью метода экземпляра с именем что-то вроде «withRandomName()».

public class Client { 
    ... 
} 

public class ClientBuilder { 
    private static final int defaultNameLength = 8; 
    ... 

    public ClientBuilder randomlyNamed() { 
     this.name = Strings.randomString(defaultNameLength); 
    } 

    public Client build() { 
     return new Client(name); 
    } 
} 

public class Strings 
    private static String randomString(int length) { 
     return ...; 
    } 
} 

В качестве альтернативы было бы осуществление NamingStrategy (например, ``) объекта, который предоставлен объект ClientBuilder.

public class RandomNames implements NamingStrategy { 
    private static final int defaultNameLength = 8; 
    public String name() { 
     return String.randomString(defaultNameLength); 
    } 
} 


public class ClientBuilder { 
    private final NamingStrategy nameSource; 
    public ClientBuilder(NamingStrategy nameSource) { 
     this.nameSource = nameSource; 
    } 

    public Client build() { 
     return new Client(nameSource.name()); 
    } 
} 
0

Чистым способом будет иметь отдельный класс ClientGenerator, который производит клиентов. Поскольку создание клиентов - это не типичное поведение клиента, а в вашей модели приложения клиент является не более чем пассивным контейнером данных для свойств клиента. Однако создание клиентов - это деятельность в «домене клиента». Поэтому было бы целесообразно создать статический метод Client.NewClient(), как это делает .NET feamework с Guid. С другой стороны, природа природы гида должна быть сгенерирована, она не представляет собой нечто в реальном мире. Это нерегулярный идентификатор. Таким образом, сравнение может быть не все, что лигититивно.

Общей аналогичной ошибкой (или примесью, если хотите) является метод сохранения объекта. Вместо этого нужно иметь класс Persister, который выполняет эту работу. Или менеджер. Поскольку «Сохранить» - это то, что вы можете сделать с классом или с ним, а не поведением класса ifself.

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