Объявление атрибута класса: частный по сравнению с общественностью

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

import math
import matplotlib.pyplot as plt

x_array = []
y_array = []

for num in range(0, 10000):
    x = num/100
    y = math.sin(x) * (.99 ** x)
    x_array.append(x)
    y_array.append(y)

x_maximums = []
y_maximums = []

for i in range(2, len(y_array) - 2):
    if y_array[i - 2] < y_array[i - 1] and y_array[i - 1] < y_array[i] and y_array[i + 2] < y_array[i + 1] and y_array[i + 1] < y_array[i]:
        y_maximums.append(y_array[i])
        x_maximums.append(x_array[i])


plt.plot(x_array, y_array)
plt.scatter(x_maximums, y_maximums, color='k')
plt.show()

Выходы: Plot with peaks shown ПРИМЕЧАНИЕ Излишние производные, которые я взял, не нужны для моего поста. Я включил их, потому что возможно, что ваш набор данных имеет небольшие различия между числами, которые неправильно помечают некоторые из них как локальный максимум, если вы сравниваете только два ближайших числа (Общее в экспериментальных данных). В качестве альтернативы можно взять производные, например:

if y_array[i - 2] < y_array[i] and y_array[i - 1] < y_array[i] and y_array[i + 2] < y_array[i] and y_array[i + 1] < y_array[i]:

Если это имеет для вас больше смысла, или, возможно, даже каким-то другим образом, если вы все еще получаете странные результаты!

13
задан brsunli 3 April 2009 в 00:42
поделиться

9 ответов

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

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

10
ответ дан 1 December 2019 в 21:53
поделиться

В ближайшей перспективе нет ни одного кроме создания недовольных пуристов ООП.

(Я предполагаю, что Вы означаете выставлять свойства, которые иначе использовали бы методы считывания/методы set - очевидно, существует большая разница при отъезде ВСЕЙ общественности атрибутов).

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

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

Например.

void Foo::setWeight(float weight)
{
  ASSERTMSG(weight >= 0.0f && weight <= 1.0f, "Weights must fall in [0..1]");
  mWeight = weight;
}

Это также позволяет Вам позже изменять поведение своего объекта, не будучи должен осуществить рефакторинг клиентский код.

Например.

void Foo::setSomething(float thing)
{
  mThing = thing;
  // 2009/4/2: turns out we need to recalc a few things when this changes..
  ...
}
11
ответ дан 1 December 2019 в 21:53
поделиться

Поскольку необходимо всегда стремиться защитить реализацию от интерфейса. Если Вы обнародовали атрибут, Вы сообщаете клиенту, как Ваша реализация для того атрибута.

Это связывает Вас в хранении не только интерфейс, но также и реализация.

Кроме того, можно выполнить другие умные вещи как проверка, управление доступом, учет при использовании метода. Если Вы обнародовали атрибут, Вы имеете намного меньше контроля того, что клиент может сделать с тем атрибутом

2
ответ дан 1 December 2019 в 21:53
поделиться

Главным образом из-за понятия OO инкапсуляции. Используя частный Вы инкапсулируете доступ к своей переменной объекта, удерживающей контроль над статусом объекта. Не позволяя внешним объектам изменить состояние Вашего объекта, что Вы не знаете.

Простым примером был бы Карманный объект.

    class Pocket {
 public int numberOfCoins = 10;
 private boolean haveMoney = true;

 public void giveOneCoin(){
    if(stillHaveMoney()){
     numberOfCoins--;
     if(numberOfCoins=<0){
         haveMoney=false;
     }
   }
 }

 public boolean stillHaveMoney(){
  return haveMoney;
 }

}

И теперь вообразите другой класс как указано ниже:

class PickPockets {
   public void getSomeMoney(Pocket pocket){
      pocket.numberOfCoins=0;
   }
}

Конечно, это - простой пример. однако это показывает, как важно иметь контроль над доступом к Вашим полям/атрибутам класса. Вообразите более сложный объект с намного более сложным государственным контролем. Инкапсуляция делает абстракцию и непротиворечивость объекта лучше.

1
ответ дан 1 December 2019 в 21:53
поделиться

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

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

0
ответ дан 1 December 2019 в 21:53
поделиться

При создании метода доступа Вы разделяете реализацию от интерфейса.

0
ответ дан 1 December 2019 в 21:53
поделиться

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

Общедоступные атрибуты также "создают помехи" интерфейсу. Чем меньше общественности приписывает Вас подарок, тем "инструмент для очистки" и легче Ваш объект должен будет работать с. Наличие некоторых частных атрибутов дает Вам гибкость при обеспечении простоты использования, которая иначе не была бы там.

0
ответ дан 1 December 2019 в 21:53
поделиться

Обычно вы должны использовать частные объявления для полей, которые вы хотите изолировать в логике вашей программы, ТОЛЬКО если вы сочтете это необходимым.

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

Итак, почему большинство людей спонтанно отвечают БОЛЬШИМ ДА на частные заявления?

Потому что:

  • Их учили делать это «точно так же» в колледже. (самая разумная причина)
  • Они, в конечном счете, глупо и сразу же предположить, что вы либо создаете библиотеку кода, либо программный компонент, который будут использовать другие, ИЛИ работаете над некоторой реализацией криптографии. ТОЛЬКО в этих случаях вы не были бы уверены, что произойдет с вашими полями.

Итог на удивление "коммерческий" !! Если вы «продаете» его, то идите в частную жизнь, в противном случае делайте то, что вам нравится.

0
ответ дан 1 December 2019 в 21:53
поделиться

В долгосрочной перспективе вам будет лучше, если все атрибуты будут частными. Это включает в себя отказ от использования геттеров. Если вы обращаетесь к атрибутам объектов, значит, вы нарушаете инкапсуляцию и вообще не выполняете ООП. В этот момент большая часть причин для создания класса была потеряна. Зачем строить замок для защиты от злоумышленников, а затем оставлять все двери открытыми? Или (с геттерами) всегда приветствовать злоумышленников по запросу.

Было показано, что методологии «Закона Деметры» и «Скажи, не спрашивай» уменьшают количество ошибок в производственном коде. Использование общедоступных атрибутов не сделает объектно-ориентированных пуристов несчастными, оно просто оттолкнет их с помощью вашего кода.

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

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

0
ответ дан 1 December 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: