Автор Тема: На тему низкого качества ПО  (Прочитано 13096 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: На тему низкого качества ПО
« Ответ #15 : Ноябрь 19, 2013, 08:30:21 am »
Пугать людей синтаксисом плюсовых шаблонных коллекций?  :D

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #16 : Ноябрь 19, 2013, 09:39:14 am »
Пугать людей синтаксисом плюсовых шаблонных коллекций?  :D
Ну перепиши на другом синтаксисе и покажи результат :-) Семантика должна остаться та же естественно.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: На тему низкого качества ПО
« Ответ #17 : Ноябрь 19, 2013, 10:25:41 am »
Не совсем понял, что ты подразумеваешь под семантикой в данном случае, но вот примерный аналог на 1С:
// описание типов
ТипЧисло15_2 = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
ТипУказательНаЗапись = Новый ОписаниеТипов("Структура");
// описание коллекции
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Ключ1", ТипЧисло15_2); // типизированный ключ
Таблица.Колонки.Добавить("Ключ2"); // произвольный тип ключа
Таблица.Колонки.Добавить("Ключ3"); // произвольный тип ключа
// и т.д.
Таблица.Колонки.Добавить("Значение1", ТипУказательНаЗапись); // типизированное значение
Таблица.Колонки.Добавить("Значение2"); // произвольный тип значения
// и т.д.

Таблица.Индексы.Добавить("Ключ1"); // простой индекс
Таблица.Индексы.Добавить("Ключ2, Ключ3"); // составной индекс

// Использование:
// поиск по составному индексу
Отбор = Новый Структура("Ключ1, Ключ2", Ключ1, Ключ2);
ИскомыеСтроки = Таблица.НайтиСтроки(Отбор);

Эта коллекция не 1:1 boost::multi_index_container, но смысл примерно тот же (с поправкой на динамическую типизацию)
Синтаксис простой и деревянный. :)

ps Надеюсь, я правильно понимаю, что такое boost::multi_index_container...
« Последнее редактирование: Ноябрь 19, 2013, 10:27:24 am от ilovb »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #18 : Ноябрь 19, 2013, 10:55:04 am »
Не совсем понял, что ты подразумеваешь под семантикой в данном случае, но вот примерный аналог на 1С:
// описание типов
ТипЧисло15_2 = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
ТипУказательНаЗапись = Новый ОписаниеТипов("Структура");
// описание коллекции
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Ключ1", ТипЧисло15_2); // типизированный ключ
Таблица.Колонки.Добавить("Ключ2"); // произвольный тип ключа
Таблица.Колонки.Добавить("Ключ3"); // произвольный тип ключа
// и т.д.
Таблица.Колонки.Добавить("Значение1", ТипУказательНаЗапись); // типизированное значение
Таблица.Колонки.Добавить("Значение2"); // произвольный тип значения
// и т.д.

Таблица.Индексы.Добавить("Ключ1"); // простой индекс
Таблица.Индексы.Добавить("Ключ2, Ключ3"); // составной индекс

// Использование:
// поиск по составному индексу
Отбор = Новый Структура("Ключ1, Ключ2", Ключ1, Ключ2);
ИскомыеСтроки = Таблица.НайтиСтроки(Отбор);

Эта коллекция не 1:1 boost::multi_index_container, но смысл примерно тот же (с поправкой на динамическую типизацию)
Синтаксис простой и деревянный. :)

ps Надеюсь, я правильно понимаю, что такое boost::multi_index_container...
На 1С повторить семантику приведенного владом кода невозможно. Просто потому, что 1С динамически типизирован.
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #19 : Ноябрь 19, 2013, 06:05:54 pm »
Не понял. А что тут сложного или непонятного?

Я этот код привел не потому, что хотел попугать плюсовыми шаблонами. Это все на тему того, что цикломатическая сложность мало чего показывает и ее непонятно как считать для языков уровнем выше ассемблера. Еще более простой пример: плюсовый std::for_each - это цикл, который должен быть подсчитан во всех местах использования или не цикл?

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: На тему низкого качества ПО
« Ответ #20 : Ноябрь 19, 2013, 06:44:09 pm »
Не знаю как там считать форычи, но проще всего понять ц.с. на IF'ах
Чем больше условных операторов, тем сложнее понять код, т.к. каждый IF - это отдельный сценарий выполнения.
http://msdn.microsoft.com/ru-ru/library/ms182212.aspx


ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: На тему низкого качества ПО
« Ответ #21 : Ноябрь 19, 2013, 06:52:50 pm »
Вот ц.с. 10
// path1
IF cond1 THEN
   // path2
   IF cond2 THEN
      // path3
      IF cond3 THEN
         // path4
      END;
   END;
END;
IF cond4 THEN
   // path5
   IF cond5 THEN
      // path6
      IF cond6 THEN
         // path7
      END;
   END;
END;
IF cond7 THEN
   // path8
   IF cond8 THEN
      // path9
      IF cond9 THEN
         // path10
      END;
   END;
END;

Теперь представь себе процедуру сложности 100 и выше.

ps Кажется бредом, но это реально отражает сложность кода. Т.к. для понимания алгоритма нужно "загрузить" в мозг все возможные сценарии и проанализировать. А "загрузить" более 10 сценариев уже сложно, ибо не могет больше мозг.
« Последнее редактирование: Ноябрь 19, 2013, 06:56:18 pm от ilovb »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #22 : Ноябрь 19, 2013, 06:59:40 pm »
Не знаю как там считать форычи, но проще всего понять ц.с. на IF'ах
Чем больше условных операторов, тем сложнее понять код, т.к. каждый IF - это отдельный сценарий выполнения.
http://msdn.microsoft.com/ru-ru/library/ms182212.aspx
Дык ветвление это совсем не обязательно if/switch/for :-) Это может быть банально вычисление индекса с последующим исполнением функции указатель на которую хранится по соответствующей ячейке массива :-) И ни одного if'a не будет вообще, только чистая арифметика :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: На тему низкого качества ПО
« Ответ #23 : Ноябрь 19, 2013, 07:07:05 pm »
Ну я верю, что на сях можно написать абсолютно прямолинейный и абсолютно адский код.  :D
Но как я уже говорил, ц.с. это не отменяет не в коем разе.
Т.е. если у тебя ц.с. в коде 50 то не имеет никакого значения, что там вычисляется на указателях, т.к. это уже говно по дефолту.

И еще:
ц.с. - это не абсолютная метрика. Это лишь одна из...
Выделяется она лишь тем, что ее легко подсчитать, она очевидна и достоверна.
Т.е. это первое что нужно проверять. Если ц.с. удовлетворительная, то можно и другие метрики померить для надежности.
« Последнее редактирование: Ноябрь 19, 2013, 07:10:46 pm от ilovb »

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: На тему низкого качества ПО
« Ответ #24 : Ноябрь 19, 2013, 07:15:48 pm »
Можно на реальный код посмотреть:
ц.с. 9 если не ошибаюсь.
   PROCEDURE (tree: Tree) Delete* (IN data: Data), NEW;
      VAR
         node, parent, temp: Node;
   BEGIN
     
      node := Search(tree.root, data);   
     
      IF node # NIL THEN
     
         IF (node.left # NIL) OR (node.right # NIL) THEN
            parent := Next(node);
         ELSE
            parent := node;
         END;

         IF parent.left # NIL THEN
            temp := parent.left;
         ELSE
            temp := parent.right;
         END;
         
         IF temp # NIL THEN   
            temp.parent := parent.parent;
         END;

         IF temp.parent = NIL THEN
            tree.root := temp;
         ELSE
            IF (parent.parent.left = parent) THEN
               parent.parent.left := temp;
            ELSE
               parent.parent.right := temp;
            END;
         END;
         
         IF parent # node THEN
            node.CopyFrom(parent);
            node.color := parent.color;
         END;

         IF parent.color = black THEN
            DeleteFixUp(tree, temp);
         END;
         
         parent.color := deleted;
     
      END;
     
   END Delete;

Легко понять? Где ошибка? (она есть)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #25 : Ноябрь 19, 2013, 07:20:09 pm »
Не знаю как там считать форычи, но проще всего понять ц.с. на IF'ах

У меня нет проблем с пониманием :) У меня проблема с тем, что профит маленький (хотя и ненулевой). Т.е., сабжевая проблема не может быть принципиально улучшена только за счет подсчета ифов.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: На тему низкого качества ПО
« Ответ #26 : Ноябрь 19, 2013, 07:23:02 pm »
Я пытаюсь донести мысль что если сложность > 10, то все остальное уже не имеет смысла анализировать, т.к. для начала надо ц.с. привести в порядок.

Скажу иначе. Если у тебя в коде большая ц.с. то, что бы ты там не улучшал помимо ц.с., лучше код не станет.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #27 : Ноябрь 19, 2013, 07:24:49 pm »
Ну я верю, что на сях можно написать абсолютно прямолинейный и абсолютно адский код.  :D
Это и на Обероне можно, да и на жабе, да где угодно. :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: На тему низкого качества ПО
« Ответ #28 : Ноябрь 19, 2013, 07:43:44 pm »
Легко понять?

Прошу обратить внимание на этот IF
IF (node.left # NIL) OR (node.right # NIL) THEN
    parent := Next(node);
ELSE
    parent := node;
END;

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

Wlad

  • Jr. Member
  • **
  • Сообщений: 91
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #29 : Ноябрь 19, 2013, 07:56:41 pm »
Пугать людей синтаксисом плюсовых шаблонных коллекций?  :D
Ну перепиши на другом синтаксисе и покажи результат :-) Семантика должна остаться та же естественно.
Честно и откровенно?!
Даже не хочу ни одну из извилин напрягать, что там вообще такое записано!
Просто потому, что это не из моих проектов или заданий. :)
Кактотак...