LINUX.ORG.RU

Код как лапша.


0

2

Я работаю в большой компании над старым и большим проектом.

Код - миллионы строк. Почти весь код который я вижу - макароны ;)

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

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

В нем нет никакой архитектуры которая бы разбивала его на независимые части, хотя это возможно и вероятно упростило бы разработку.

Решения выбираются в основном по кретирию максимальной понятности разработчикам, но так как большинство разработчиков не знакомы (мало знакомы) с bash, системными вызовами unix, основами многопоточного программирования (методами синхронизации), то...

Некоторые «системные» вещи которые десятилетиями делаются в unix проверенным способом велосипедятся не лучшим образом.

И это не все проблемы кода на самом деле.

Но это все ерунда по сравнению со стремлением разработчиков делать все одной большой функцией. Т.е например скрипт на 6-20 сотен строк с большущей вероятностью будет одной большой функцией. Либо будет содержать парочку, но с такими именами что от них можно только запутаться. Единственное что побуждает вынести часть кода в отдельную функцию - это то, что код будет вызываться откуда-то еще, да и то не всегда.

Но тем не менее, все работает и работает быстро, проект можно назвать high load, здесь используются разные сложные мат. алгоритмы (это я к тому что уровень разработчиков очень даже хороший, с точки зрения математики.. ).

Неужели все проекты со временем становятся такими?

★★★

Чтобы видеть, как несколько похожих функций объединить в одну, надо сначала написать эти несколько функций. Потом появится понимание как это всё объединить и если будет время, если не хватит места на диске, если мозги будут не в состоянии удерживать все эти варианты, если поступит руководящий пендель , если будет болезненная тяга к совершенству ... короче, да.

зы. Ну, и если сделаешь коротко и понятно будешь не нужен.

ilovewindows ★★★★★ ()

Нет, не все. При нормальном ПМе и опытных разработчиках - не становяться. Однако стоит учесть что хороший опытный инженер - это далеко не всегда хороший software developer, бывает так, что человек отлично разбирающийся в математике, численных методах, итп, на деле - не способен на вменяемый код для большого проекта, т.к. мозги по другому работают.

qrck ★★ ()

Неужели все проекты со временем становятся такими?

Нет, вроде как.

уровень разработчиков очень даже хороший, с точки зрения математики

Сюда бы Луговского сейчас, он бы порадовался.

Solace ★★ ()

проекты которые пишут удаки без архитектора - да, становятся.

mashina ★★★★★ ()

Большинство так точно. Увы.

уровень разработчиков очень даже хороший, с точки зрения математики..

Типичная проблема: есть скилл в одной области, но нет в другой.

Попробуй собрать разрабов вместе и сделать ликбез. Без наезда, просто покажи как правильно, как неправильно и объясни почему это неправильно. Заодно может повышение получишь :).

Мне на этой почве почти удалось новую должность ввести и занять. Но я забил т.к. моя бывшая контора была слишком неповоротливая для этого.

true_admin ★★★★★ ()

Мне больше интересно возможен ли постепенный рефакторинг больших проектов. И инетересен опыт. Хотя, на первый взгляд, всё просто: меняем интерфейсы и добавляем прослойки совместимости пока не будет сделана миграция всего кода. Но вот как бы это автоматизировать...

Однозначно нужны тесты в большом кол-ве, но часто их нет.

true_admin ★★★★★ ()

Есть хорошая игра - Portal. Здорово расслабляет.

И да. я тебя понимаю.

Недавно обнаружил метки и гото в коде. На дворе 2012...

vahtu ()
Ответ на: комментарий от vahtu

Недавно обнаружил метки и гото в коде. На дворе 2012...

блджад, и что?
считай, что это такой try {} catch для сишечки

и, да, в Linux Kernel goto используется

seed_stil ★★ ()
Ответ на: комментарий от seed_stil

блджад, и что?
считай, что это такой try {} catch для сишечки

do {} while(); switch() {case:} ...

Если не можешь обходиться без goto, позвони 03 и так прям скажи. Тебе помогут.

и, да, в Linux Kernel goto используется

Я был лучшего мнения о ядре. Ты открыл мне глаза.

goto в чистой сишечке можно со вкусом использовать.

tensai_cirno нельзя. Я забыл описать: запутался, пока разбирался в алгоритме. Сначала увидел метку. Пришлось поиском по метке. В итоге это гамно было заменено на do{} while;

vahtu ()

Если они писались на Scala и Clojure то нет.

anonymous ()
Ответ на: комментарий от anonymous

Если они писались на Scala и Clojure то нет.

Ты уже в Сан-Антонио? Как погодка?

anonymous ()
Ответ на: комментарий от ilovewindows

Чтобы видеть, как несколько похожих функций объединить в одну, надо сначала написать эти несколько функций.

давай досвидания

pseudo-cat ★★★ ()
Ответ на: комментарий от vahtu

Если не можешь обходиться без goto, позвони 03 и так прям скажи. Тебе помогут.

А как же выход из нескольких вложенных конструкций? Вместо

while (...) {
  if (...) {
    while (...) {
      if (...) {
        goto outta_here;
      }
    }
    if (...) {
    }
  }
  while (...) {
  }
}
outta_here:
Писать
while (... && !should_leave) {
  if (...) {
    while (...) {
      if (...) {
        should_leave = true;
        break;
      }
    }
    if (should_leave) {
      break;
    }
    if (...) {
    }
  }
  while (...) {
  }
}
А потом ещё забыть где-то дописать break или guardian-condition, запутаться и т. п.

inb4 не стоит писать такое вложенное говно изначально

anonymous ()
Ответ на: комментарий от anonymous

Плохое проектирование? Если ты споришь о циклах, то дерьмовое проектирование.

vahtu ()
Ответ на: комментарий от anonymous

Если они писались на Scala и Clojure то нет.

Верно, то чего не существует испортится не может ;)

OxiD ★★★ ()
Ответ на: комментарий от vahtu

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

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

Не знаю, описано это в документации или нет, но судя по коду это так.

OxiD ★★★ ()
Ответ на: комментарий от vahtu

apache2-2.2.20$ find ./ -name '*.c' | xargs grep 'goto' | wc -l 315

anonymous ()
Ответ на: комментарий от anonymous

просто крошить функции на более маленькие и делать return.

tensai_cirno ★★★★★ ()
Ответ на: комментарий от OxiD

Я, кажется, привел пример. Почему никто не понимает, что goto ЗЛО?

Некоторые «системные» вещи которые десятилетиями делаются в unix проверенным способом велосипедятся не лучшим образом.

Просвети меня, с каких это пор метки «проверенный» способ.

vahtu ()
Ответ на: комментарий от true_admin

Ну, я провожу рефакторинг того кода над которым работаю (в смысле при выполнении какой-то задачи я меняю связанный с ней код).

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

Автоматизировать думаю очень сложно, самое простое скрипт который сравнивает функции (блоки ?) между собой каким-нибудь левенштейном.

Слышал что у microsoft была утилита которая ищет похожие по семантике куски кода. Вроде как они ее используют, но доступна она или нет не знаю.

OxiD ★★★ ()
Ответ на: комментарий от vahtu

Просвети меня, с каких это пор метки «проверенный» способ.

Во первых у нас метки не используются, под системными вещами я имел в виду демонизацию, запуск останов сервисов и прочее.

Во вторых метки наводят путанницу когда используются бессистемно, и когда их > 1. Т.е когда на них завязана какая-то логика типа, если а то идем туда, а там иногда возвращаемся назад.

В ядре метки используются однозначно - это всегда goto error, там не делается goto каждый раз когда надо выйти из вложенного цикла, только когда надо выходить их функции с ошибкой.

По крайней мере раньше так было ;))

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

OxiD ★★★ ()
Ответ на: комментарий от vahtu

goto как скальпель, при осторожном использовании можно улучшить и читаемость, и эффективность. ИМХО.

anonymous ()
Ответ на: комментарий от vahtu

Есть хорошая игра - Postal. Здорово расслабляет.

fxd

ados ★★★★★ ()
Ответ на: комментарий от OxiD

Ну я и лошара.

под системными вещами я имел в виду демонизацию

Расскажи, как прыжок на вентиль оформить в виде метки. Жду с нетерпернием.

vahtu ()
Ответ на: комментарий от tensai_cirno

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

Или же завести переменную состояния (можно наследовать разные варианты классов в зависимости от состояния) и при разрушении (выходе) вызывать функцию зависящую от состояния.

OxiD ★★★ ()
Ответ на: комментарий от OxiD

по крайней мере в случае с++ проблем быть не должно.

Благими намерениями вымощена дорога в а... Забыл! Как дальше-то?

vahtu ()
Ответ на: комментарий от vahtu

Ты странный. В том посте я говорил как раз против меток ;)

OxiD ★★★ ()
Ответ на: комментарий от OxiD

Гуглить лень, поэтому объясню как я понимаю.

Что такое переключение задач? Это сохранение контекста и прыжок на другой прцесс.

В intel'ах это реализовано аппаратно: JMP <адрес>, если он находится в пространстве другого процесса, вызывает переключение контекста. Но это, если он валидный. Если нет получишь сегментэйшен фолт. Валидные адреса (иначе говоря точки входа в процесс) называются вентилями.

vahtu ()
Ответ на: комментарий от vahtu

а как процессор узнаёт что адрес «валидный»? неужели в таблицах страниц сам смотрит?

nanoolinux ★★★★ ()
Ответ на: комментарий от vahtu

do {} while(); switch() {case:} ...

И как только матушка-Земля таких быдлокодеров терпит? Что, прочитал в книжечку «паттерны прожектирования», где критиковали goto и пошел нести добро в массы? Лучше смени клавиатуру на метлу — это твой уровень, если ты не понимаешь, когда использование goto оправдано. Заменять goto на присваивание + break + case по константе после цикла — верх маразма.

red_eyed_peguin ()
Ответ на: комментарий от red_eyed_peguin

когда использование goto оправдано

Дату, время или пруф

vahtu ()
Ответ на: комментарий от vahtu

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

nanoolinux ★★★★ ()

Поэтому 20 лет активно разрабатывались чистые функциональные языки программирования(pure functional languages).

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

tp_for_my_bunghole ()
Ответ на: комментарий от nanoolinux

Я же сказал, что интелы делают всё аппаратно. Да там есть таблицы. Только не такие, к которым ты привык.

vahtu ()
Ответ на: комментарий от vahtu

Аппаратное переключение контекстов в интелах хоть и появилось в 80386, но по факту его не используют. А из amd64 оно вообще выпилено.

Artificial_Thought ★★★★ ()
Ответ на: комментарий от vahtu

Memory Managment Unit. Устройство управления памятью. В основном для трансляции виртуальной памяти в физическую. Для многозадачности удобен, но не необходим.

Artificial_Thought ★★★★ ()
Ответ на: комментарий от vahtu

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

nanoolinux ★★★★ ()
Ответ на: комментарий от Artificial_Thought

Речь шла о том, что процесоры автоматом переключают контекст (это сотни байт) при прыжке. ЧСХ, у сопроцессора отдельная переключалка (ибо килобайты).

О чем спорим-то?

vahtu ()
Ответ на: комментарий от vahtu

Речь шла о том, что процесоры автоматом переключают контекст (это сотни байт) при прыжке.

Что за бред? Контекст переключает ОС по прерыванию. Если джампнуть куда-то, что нам не принадлежит, то нам никто не разрешит (сегфолт получится).

Artificial_Thought ★★★★ ()
Ответ на: комментарий от Artificial_Thought

Что за бред? Контекст переключает ОС по прерыванию.

RTOS, может быть. Но, если не ошибаюсь, даже армы переключают контекст аппаратно.

vahtu ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.