2013-07-10 4 views
0

При написании программы, мое понимание, как любитель программист, есть три способа выполнить большинство вещей:Правильный выбор петель по сравнению с функцией против объекта/класса

  • создают петли
  • создавать и использовать функцию
  • создания и использования объекта

Я использую JavaScript здесь, чтобы задать свой вопрос, так как я взял обучение на нем около 2-3 недель назад. Это несколько странно по сравнению с тем, что я использовал в python или MatLab в университете, но это не главное. Я часто думаю, что должен быть хорошим выбором среди трех в конкретном приложении, поэтому я хотел знать ваше предложение.

Я хотел создать список массива для последующего использования для построения графика. Предполагается, что программа принимает коэффициенты уравнения, инкрементный шаг и границу для значений х. Ниже приведен код (Извините, если я что-то пропустил ниже при изменении, чтобы соответствовать SO, но она работает несколько секунд, прежде чем!):

function array_creator(input_coeff,inc, boundary){ 
var bound=boundary||[0,1]; 
var eqn_deg=input_coeff.length-1; 
var increment=inc; 
var x_init=bound[0]; 
var y_val=0; 
var graph_array=[]; 
while (x_init<=bound[1]){ 
    for(var i=0;i<input_coeff.length;i++){ 
     y_val=y_val+input_coeff[i]*Math.pow(x_init,eqn_deg); 
     eqn_deg--; 
      } 

    new_arr=[x_init,y_val]; 
    eqn_deg=input_coeff.length-1; 
    y_val=0; 
    graph_array.push(new_arr); 
    x_init=x_init+increment; 
    } 
return graph_array; 
} 

В коде выше, у меня есть один вложенный цикл, который идет внутри время, но я Я использую для написания кодов, которые занимают более 3-4 глубины гнездования, и я не могу выкапывать свою собственную программу через неделю после. Поэтому мой вопрос заключается в том, когда я должен знать, что пришло время реализовать отдельную функцию, а не вложенность или знать время для создания объекта. Каковы выгоды и потери от разбиения одной большой замкнутой функции на несколько функций с точки зрения ясности и эффективности? В какой момент создание объекта становится существенным, или это просто, когда мне нужно снова использовать тот же код.

Когда единственный инструмент у вас есть молот, все выглядит как гвоздь. Когда я начал изучать python после MatLab, меня настолько впечатлил подход OO, который я использовал для создания классов в любой ситуации независимо от того, нужны они или нет. Я думаю, что многие новички SO будут рады найти системный подход к этим основам программирования.

+0

Итак, этот вопрос должен быть закрыт с аргументом о том, что он основан на мнениях .. hummm ... из когда знание хороших методов программирования стало основано на мнениях? –

+1

Модераторы, вероятно, считают ваш вопрос слишком широким для StackOverflow. Ожидается, что люди зададут практические вопросы, которые уже включают попытку решить проблему. Может быть, вы можете рассмотреть вопрос о пересмотре своего вопроса? – Nobilis

+1

@Jack_of_All_Trades «Хорошие практики программирования» - это мнения, а некоторые люди не согласны с ними. StackOverflow обычно предназначен для вопросов, где ответ не является мнением; это то, что либо работает, либо отвечает требованиям апеллянта, либо не работает и отвечает требованиям апеллянта. Что-то вроде «Какая версия этого кода выглядит лучше?» или «Должен ли я делать ** x **, чтобы сделать это более читаемым?» просят мнения. Это, однако, не означает, что ваш вопрос не является чем-то полезным, просто StackOverflow может оказаться не подходящим для него. –

ответ

1

Лично, что касается петель, у меня есть жесткое отсечение трех. Если я когда-либо ударил три вложенных цикла (не считая условий if/else или условий try/catch), то я знаю, что пришло время разбить его на отдельные функции.

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

Использование классов очень зависит от языка. В javascript все уже является объектом, поэтому вам действительно не стоит беспокоиться об обертывании функций в классах, хотя опять же будут небольшие накладные расходы. Однако для языков, таких как Java, вы должны стремиться к созданию большого количества небольших классов. JVM чрезвычайно оптимизирован для разговора между несколькими классами, а компилятор JIT не должен загружать какой-либо дополнительный «goo», задействованный в классах, если вам это действительно не нужно.

В целом, производительность - это не то, что вы должны принимать большинство своих решений на основе (производительность очень 80/20, и все, что вам обычно нужно, - это 80, не делающий ничего откровенно глупого.) Вы действительно должны попытаться следовать шаблону, который сделает ваш код максимально читабельным для других разработчиков. Трудно определить жесткое и быстрое правило, так как на эту тему много лагерей. В общем, для начинающего программиста моим советом было бы посмотреть много кода и попытаться понять, что происходит. Попробуйте переписать части кода в более удобочитаемом формате, если сможете. В Github достаточно открытого исходного кода, чтобы его было довольно легко сделать.

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

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