2015-03-06 4 views
7

Предположим, у меня есть автомобиль с пятью параметрами, {numwheels, цвет, пробег, лошадиная сила, maxSpeed}. У меня есть метод, который нуждается в 3 из этих значений. Какой из двух вариантов считается лучшей практикой? Лучше ли передавать охватывающий объект и уменьшать количество параметров, ИЛИ просто передавать минимально-минимальные данные в метод (например: числовые символы и цвет не будут доступны в методе 2)?Хорошо ли передавать минимальные параметры?

  1. Вариант 1 проход весь объект:

    void compute(Car c, Person p) { 
        return c.mileage + c.horsepower + c.maxSpeed + p.age; 
    } 
    
  2. Вариант 2: передать все значение методы.

    void compute(int mileage, int horsepower, int maxSpeed, int age) { 
        return mileage + horsepower + maxSpeed + age.; 
    } 
    

Примечание: предположим, по какой-то причине, вычислить не может быть частью класса Car. Пожалуйста, ответьте на это предположение.

+1

Это, вероятно, вкус, который решает.Следующее соглашение всегда помогает, поэтому я бы сказал, что переход с меньшими аргументами более распространен, имеет больше смысла, и наиболее важным является более гибкий (изменение полей в классе «Car» не меняет подписи метода). – Dragan

ответ

6

Это лучше передать прилагаемое объект, поскольку любое изменение числа параметров, необходимых при расчете не будет влиять на сигнатуру метода в будущем.

Вы можете, фактически, принять интерфейс, скажем, Vehicle. Это позволяет одному и тому же методу вычислить данные по Bike, Jet и т. Д. Далее.

public int compute(Vehicle veh) { 
    return veh.computePerformance(); 
} 

, где Car реализует метод как

public int computePerformance() { 
    return mileage + horsepower + maxSpeed; 
} 

Идея заключается в том, чтобы писать код, который легко поддается расширяемости.

+0

Лучше передать закрытый объект, потому что любое изменение количества параметров, требуемых в вычисление не повлияет на подпись метода в будущем. - Это ответы! – JavaDeveloper

5

Я бы предложил третий вариант: добавьте метод «вычислить» в «Автомобиль».

Это называется «Скажи, не спрашивай».

См http://martinfowler.com/bliki/TellDontAsk.html

+0

позволяет сказать, что мы 'compute' нужен еще один объект под названием грузовик и почему-то не мог быть частью автомобиля? – JavaDeveloper

+0

@JavaDeveloper Может быть, сделать абстрактное суперклассное транспортное средство и реализовать нечерный метод 'compute' внутри него. Сделайте автомобиль, грузовик, все, что вам нужно, наследуйте от него (или сделайте его абстрактным, если вы хотите реализовать его позже в подклассах). Тогда все подклассы автоматически будут «вычислять». Вы можете переместить поля «пробег», «лошадиная сила» и «maxSpeed» в суперкласс. – Shashank

+0

@Shashank позволяет предположить, что 'compute' нуждается в другом классе Person, который не связан в иерархической иерархии класса. Точка вопроса заключается не в том, чтобы узнать наследование, а о 'pass more params vs pass single object' – JavaDeveloper

2

Предлагаю второй вариант.

Почему?

Допущение один: Ваш метод вычисления используется какой-либо другой класс, чтобы вычислить пробег сказать «класс Владелец»

Успенская два: Предположим, что завтра ваш метод вычисления необходим еще один атрибут из класса Car, чтобы вычислить возраст мили.

Если вы идете по первому варианту: тогда вам придется ввести еще один параметр в вычислении метода, который приведет к проблемам компиляции в других классах, вызывающих ваш метод. В этом случае «владелец класса».

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

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