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


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

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

    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).  Первая версия работает быстрее  и  требует  значительно
меньше памяти.
     Коротко говоря,  избыточный код может быть  следствием  либо
неряшливости  при программировании,  либо неверного выбора метода
реализации процедуры.

 
Следующая статья »