Энциклопедия Turbo Pascal. Главы 9-11 - Предотвращение дублировния кода

ОГЛАВЛЕНИЕ

Предотвращение дублировния кода

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

    Read(a);
    Read(y);
    if a<10 then WriteLn('Недопустимый ввод');
    if Length(y)=0 then WriteLn('Недопустимый ввод');

В данном случае предложение  WriteLn('Недопустимый ввод') встречается дважды. Однако, это не необходимо, так как фрагмент может быть переписан следующим образом

    Read(a);
    Read(y);
    if (a<10 or (Length(y)=0) then WriteLn('Недопустимый ввод');

В таком варианте код не только короче, но и будет в действительности выполняться быстрее, так как выполняется только одно предложение if/then вместо двух.

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

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

    type
      str80 = string[80];
      StrArray = array [1..100] of str80;

    function StrSearch1(str: StrArray; word: str80): boolean;
    { правильный, неизбыточный код }
    var
      t: integer;
    begin
      StrSearch1 := FALSE;
      for t := 1 to 100 do
       if str[t]=word then StrSearch1 := TRUE;
    end;

    Function StrSeach2(str: StrArray; word: str80): boolean;
    {неправильный, избыточный код }
    var
      t: integer;
    begin
      t :=1;
      StrSearch := FALSE;
      if str[t]=word then StrSearch2 := TRUE
      else
      begin
      t := 2;
      while(t<=100) do
      begin
       if str[t]=word then StrSearch2 := TRUE;
       t := t+1;
      end;
     end;
    end;

При втором методе не только дублируются предложения сравнения if/then, но также имеются два предложения присваивания (t:=1 и t:=2). Первая версия работает быстрее и  требует значительно меньше памяти.

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