Я написал класс с методом "init". Должен ли я вызывать его из других методов класса? Или оставить это на усмотрение пользователя объекта? (Проектирование кода)

Я написал класс с методом "init". Должен ли я вызывать его из других методов класса? Или оставить это на усмотрение пользователя объекта? (Проектирование кода)
Я написал класс с методом "init". Должен ли я вызывать его из других методов класса? Или оставить это на усмотрение пользователя объекта? (Проектирование кода) - markusspiske @ Unsplash

Метод init() — это симптом, а не проблема, которую нужно решить.

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

Поскольку каждый метод может вызвать исключение, если объект не инициализирован, вызывающие объекты всегда должны проверять объект перед вызовом метода. И когда они вызывают init()? Могут ли они назвать это более одного раза?

У Лайва определенно есть хорошее предложение скрыть эту логику инициализации. Это требует другого дизайна для других методов. Они должны работать, даже если база данных и фоновый поток не были инициализированы. В основном вам нужна очередь в памяти, когда другие методы вызываются до полной инициализации объекта.

private void init():
    connect to database
    verify existence of a table
    start a thread
    initialized = true

    for params in doSomethingParams
        // replay method calls invoked before this object was initialized
        doSomething(params)

public String doSomething(Some Input):
    if !initialized
        init();
        doSomethingParams.add(Some Input);
    else
        someJobQueue.add(Some Input);

    return "what you would have normally returned";

После инициализации пройдитесь по всем «локальным» очередям, чтобы поместить вещи во вновь инициализированную очередь заданий. Дело в том, что убедитесь, что этот метод работает успешно, даже если фоновый поток или база данных недоступны, путем помещения параметров в список. Когда эти другие ресурсы доступны, выполните цикл по этому локальному списку и снова вызовите doSomething, передав параметры в списке, который по существу «повторяет» прошлые вызовы метода.

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

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


LetsCodeIt, 22 апреля 2023 г., 00:22