Использование «псевдооператора», чтобы отличить простое повторение от общего для циклов - PullRequest
2 голосов
/ 24 февраля 2010

Мне бы хотелось узнать мнение других людей о следующем стиле написания цикла for:

for (int rep = numberOfReps; rep --> 0 ;) {
   // do something that you simply want to repeat numberOfReps times
}

Причина, по которой я изобрел этот стиль, состоит в том, чтобы отличать его от более общего случая циклов for. Я использую это, только когда мне нужно просто повторить что-то numberOfReps раз, и тело цикла не использует значения rep и numberofReps в любом случае .

Насколько я знаю, стандартная Java, например, не имеет простого способа сказать "просто повторите это N раз", и именно поэтому я придумал это. Я бы даже сказал, что тело цикла не должно continue или break, если это явно не задокументировано в верхней части цикла for, потому что, как я уже сказал, вся цель состоит в том, чтобы сделать код легче понять, придумав особый стиль для выражения простых повторений.

Идея состоит в том, что если то, что вы делаете, является не простым (зависимость от значения увеличивающегося / убывающего индекса, break с, continue с и т. Д.), Тогда используйте стандарт for петля. Если то, что вы делаете , является простым повторением, с другой стороны, тогда этот отличный стиль передает этот "факт" (разумеется, если вы знаете назначение стиля).

Я сказал "факт", потому что, конечно, можно злоупотреблять стилем. Я работаю при условии, что у вас есть компетентные программисты, цель которых состоит в том, чтобы сделать их код проще , а не сложнее .


Был сделан комментарий, согласно которому принцип for следует использовать только для простой итерации, а while следует использовать иначе (например, если переменные цикла изменены в теле).

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


Какое совпадение, Джош Блох просто написал в Твиттере следующее:

  Goes-to Considered Harmful:

  public static void main(String[] a) {
    int i = 10;
    while (i --> 0) /* i goes-to 0 */ {
      System.out.println(i);
    }
  }

К сожалению, никакого объяснения не было дано, но кажется, что по крайней мере этот псевдооператор имеет имя. Это также обсуждалось ранее на SO: Как называется этот оператор: «->»?

Ответы [ 2 ]

6 голосов
/ 24 февраля 2010

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

Вы продолжаете упоминать Java, у которого уже есть устоявшаяся идиома для того, чтобы делать что-то n раз:

for (int i = 0; i < numberOfReps; i++) {
   // do something that you simply want to repeat numberOfReps times
}

Хотя ваш шаблон работает так же хорошо, он сбивает с толку других. Когда я впервые увидел это, мои мысли были:

  1. Что это за странная стрела?
  2. Почему эта линия подмигивает мне?

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

2 голосов
/ 24 февраля 2010

Почти каждый язык в наши дни имеет лямбду, поэтому вы можете написать такую ​​функцию, как

nTimes(n, body)

, который принимает int и лямбду и более прямо сообщает намерение. В F #, например

let nTimes(n,f) =
    for i in 1..n do f()

nTimes(3, fun() -> printfn "Hello")    

или, если вы предпочитаете методы расширения

type System.Int32 with
    member this.Times(f) =        
        for i in 1..this do f()

(3).Times(fun() -> printfn "Hello")    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...