Как следует из названия, допустим, что у меня есть class
со многими methods
и 80% из них:
- Мне нужно также установить как общедоступный (функциональность 1: 1)
- Они используют друг друга
Какой подход является лучшим с точки зрения расширения и тестирования в будущем?Конечно, приведенные ниже примеры тривиальны, но давайте предположим, что у меня есть класс с 20-30 методами внутри.Если это поможет, проект написан на ReactJS.
Подход 1:
Этот подход самый быстрый для меня.
- Нет повторения кода
- Я использую
functions
внутри class
, также совместно с внешним - Некоторые функции зависят от других
class Approach1 {
names = [];
/* Establish methods for users also */
publicApi = {
check: this.check,
setValue: this.setValue
};
/**
* Public method 1
* @public
* @param {string} name
* @returns {boolean}
*/
check = name => name === "foo";
/**
* Public method 2 using internally method 1
* @public
* @param {string} name
* @returns {boolean}
*/
setValue = name => {
if (this.check(name)) names.push(name);
};
}
Подход 2:
IНе думаю, что этот подход хорош.
- Повторение кода
- Я использую
functions
внутри class
, также разделяю снаружи - Функции не зависят отдруг друга
class Approach2 {
names = [];
/* Establish methods for users also */
publicApi = {
check: this.check,
setValue: this.setValue
};
/**
* Public method 1
* @public
* @param {string} name
* @returns {boolean}
*/
check = name => name === "foo";
/**
* Public method 2 with own implementation
* @public
* @param {string} name
* @returns {boolean}
*/
setValue = name => {
if (name === "foo") names.push(name);
};
}
Подход 3:
Этот подход выглядит лучше, но я вижу много дополнительного кода.
- Дополнительный код (мне нужно инкапсулировать почти каждый приватный метод)
- Я разделяю один и тот же
functions
на приватный и публичный - Частный
method
может зависеть друг от друга - Публичный
methods
всегда зависит от частного methods
class Approach3 {
names = [];
/* Establish methods for users also */
publicApi = {
check: this.check,
setValue: this.setValue
};
/**
* Private method 1
* @private
* @param {string} name
* @returns {boolean}
*/
_check = name => name === "foo";
/**
* Private method 2
* @private
* @param {string} name
*/
_setValue = name => {
if (this._check(name)) names.push(name);
};
/**
* Public method 1 (encapsulating private method)
* @public
* @param {string} name
* @returns {boolean}
*/
check = name => _check(name);
/**
* Public method 2 (encapsulating private methods 1 and 2)
* @public
* @param {string} name
*/
setValue = name => {
if (this._check(name)) this._setValue(name);
};
}
Спасибо за любые советы:)