Инициализируйте переменные-члены в методе, а не в конструкторе - PullRequest
1 голос
/ 10 июня 2011

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

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

Упрощенный псевдокод:

public_method(parameter a)
    do something with a
    private_method(string_a, a)
    private_method(string_b, a)
    private_method(string_c, a)

private_method(String, parameter a)
    do something with String and a

Дополнительная информация: параметр a является картой только для чтения с более чем 100 записями, и на самом деле я буду вызывать private_method примерно 50 раз

Ответы [ 4 ]

2 голосов
/ 10 июня 2011

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

Обратите внимание, что я программист, который вносит множество изменений в код, всегда пытаясь его улучшить. Таким образом, я согласен только на код, который поддается изменениям, readbale, вы бы назвали этот «гибкий» код. Я согласен только на очень четкий код.

После экспериментов я пришел к таким результатам:

  1. Передача в качестве параметра вполне допустима, если у вас есть одно или два коротких номера таких значений. Проход по параметрам имеет очень хорошую видимость, четкость, четкие проходные линии, хорошо видимый срок службы (точки инициализации, точки разрушения), поддается изменениям, легко отслеживается.
    Если число таких значений начнет расти до> = 5-6 значений, я вернусь к подходу № 3 ниже.

  2. Передача значений через учеников - не принесла пользы для ясности моего кода, в конце концов я избавился от него. Это делает код менее понятным. Код становится запутанным. Мне это не понравилось. У него не было никаких преимуществ.

  3. В качестве альтернативы (1) и (2) я принял подход класса Inner, в случаях, когда количество таких значений> 5 (что приводит к слишком длинному списку аргументов).
    Я упаковываю эти значения в небольшой внутренний класс и передаю такой объект по ссылке в качестве аргумента всем внутренним членам.
    Открытая функция класса обычно создает объект класса Inner (я называю это Impl или Ctx или Args) и передает его частным функциям.
    Это сочетает в себе ясность прохождения аргумента с краткостью. Это прекрасно.

Удачи

Edit

Consider preparing array of strings and using a loop rather than writing 50 almost-identical calls. Something like char *strings[] = {...} (C/C++).

2 голосов
/ 10 июня 2011

Это действительно зависит от вашего варианта использования.Представляет ли «a» состояние, которое волнует ваше приложение / объект?Тогда вы можете захотеть сделать его членом вашего объекта.Оцените общую картину, подумайте об обслуживании, расширяемости при проектировании конструкций.

1 голос
/ 11 июня 2011

В идеале метод не должен содержать более 7 параметров.Использование числа параметров более 6-7 обычно указывает на проблему с дизайном (представляют ли 7 параметров объект вложенного класса?).

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

FromС точки зрения производительности (потребление памяти), опорные параметры могут передаваться как параметры метода без какого-либо значительного влияния на потребление памяти, поскольку они передаются по ссылке, а не по значению (т. е. копия данных не создается).Для небольшого количества параметров, которые можно сгруппировать, вы можете использовать struct.Например, если параметры представляют x и y координаты точки, то передайте их в единую Point структуру.

Bottomline
Задайте себе этот вопроспредставляет ли параметр, который вы задаете в качестве членов, какую-либо информацию (данные) об объекте?(данные могут быть государственной или уникальной идентификационной информацией).Если ответом на его вопрос является «нет», не включайте параметр в качестве члена класса.

Дополнительная информация

1 голос
/ 10 июня 2011

Если ваш параметр a относится к вашему классу, вы можете сделать private_method открытым методом для переменной a.

В противном случае, я не думаю, что это выглядит странно.Если вам нужна всего лишь одна функция, делать ее закрытой переменной вашего класса было бы глупо (по крайней мере для меня).Однако, если вам это понадобится 20 раз, я бы сделал это: P Или, что еще лучше, просто сделайте «a» свой собственный объект, который имеет определенную нужную вам функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...