Коллекции загружаются
Я тут увидела самое наглядное различие между кодом, который писали программисты, и кодом, который писали биологи, которое только может быть. Это просто гениально, просто гениально.
Биоинформатический тул выдает фрейм: список генов и некоторое значение для каждого из этих генов. Как будет оформлен вывод у программиста?.. Ну да, простая табличка через пандас, разделитель какой-нибудь таб, всё понятно. Как он оформлен тут? После каждого гена идет различное количество пробелов, такое, чтобы если открыть файл в блокноте, значения, соответствующие этим генам, выстраивались в одну колонку. Я рыдала и билась об стол больше минуты. PS. А еще тул очень мееееедлеееенннныый, и считается долго-долго. А когда досчитается - в нем захардкожено сохранять посчитанный файл по пути ./Outputs/*.txt Разумеется, он сам не создаст нужную папку Outputs, которой нет в клоне с гита. Разумеется, не найдя её, он упадет, ничего не сохранит, и его надо будет запускать еще раз. #реал #этопздц #боль 28 февраля 2019
7 |
ДНИЩE--ЫЫЫЫ
|
|
> .DS_Store
|
Lost-in-TARDIS
мы кодили как могли (с) |
Ластро
|
|
Первое, с чего бы я начил рефакторинг этой партянки, это разбил исходник на части. Просто, чтобы осмыслить то, что там написано. Впрочем, предположу что знания биологии сильно облегчают процесс осмысления данного кода.
|
Facensearo Онлайн
|
|
> Тут просто риторический вопрос, ну как, как можно было такой формат вывода вообще придумать.
Ну кстати, это же овеянный годами формат, с фиксированной шириной колонки, такой цсв курильщика. Его даже эксель умеет импортировать, и однажды мне это даже понадобилось. Да и для генерации, полагаю, никаких ухищрений не надо, учитывая, что форматированный вывод умеет в ширину поля из коробки в большинстве ЯП и библиотек, начиная с сишного printf("%-20.20s",str); 2 |
Facensearo
Кажется, я слишком молода для такого дерьма. |
Facensearo Онлайн
|
|
конечно, он восходит к матричным принтерам и моноширинному консольному выводу
(кстати, а теперь я и задумался, что для консолесранья он будет даже и удобнее тсв, только надо, конечно, дублировать вывод в файл в формате человеческом) |
Facensearo Онлайн
|
|
> Первое, с чего бы я начил рефакторинг этой партянки, это разбил исходник на части. Просто, чтобы осмыслить то, что там написано. Впрочем, предположу что знания биологии сильно облегчают процесс осмысления данного кода.
эм, а с чего бы это портянка? глянул на гитхабе - всего тысяча строк. Алсо, если чо, вывод в строках с 623 puts "Writing output to: #{$OUT_DIR}#{$cancer}_results.txt" genes = sort_hash($selected_genes) fo = File.open("#{$OUT_DIR}#{$cancer}_results.txt", 'w') genes.each { |e| fo.puts "#{e.ljust(10)} #{($selected_genes[e].to_f*100/$NUM_AVG_ITER). round(1)}%" } Я раби не знаю нихуя, но воткнуть Dir.mkdir("#{$OUT_DIR}") перед fo - .. должно помочь от несоздавания папки, а заменить "#{e.ljust(10)} на просто "#{e}\\t - от говноедства с выравниванием |
Facensearo
>>>конечно, он восходит к матричным принтерам и моноширинному консольному выводу Это когда я под стол ходила или когда меня еще в планах не было? >>>Я раби не знаю нихуя, но воткнуть Dir.mkdir("#{$OUT_DIR}") перед fo - .. должно помочь от несоздавания папки, а заменить "#{e.ljust(10)} на просто "#{e}t - от говноедства с выравниванием Очень вероятно (я просто тоже руби не знаю нихуя). Энивей, всё равно переписывать. |
Ластро
|
|
Facensearo, у меня пунктик, я стараюсь декомпозировать на максимальное число частей. Код одним куском у меня вызывает нервный тик. Я хочу видеть структуру, которую могу обозреть одним взглядом.
То есть это либо должна быть структура файлов. Либо код реально должен помещаться на один экран. |
Facensearo Онлайн
|
|
Да ты же поехавший!
я пуризма уровня "один файл - один класс - один экран - ̶e̶i̶n̶ ̶f̶ü̶h̶r̶e̶r̶" давно не видел. Даже сторонники "один метод - один экран, причем консольный 25x80" уже подвымерли, кажется. В принципе, даже если опустить удивительный мир кодогенерации по какой-нибудь модели данных (стопятьсот тысяч строк с одного json, стопятьсот миллионов с xsd), то я не вижу никакого смысла резать модули сверх необходимого. //============================ не, тыща строк - это дофига на самом деле, но учитывая, что в сабж тупо затолканы всякие utils и прочие методы, а сама задача решается в банальном процедурном стиле — сойдет, да, зачем растаскивать скрипт по разным файлам вот если чуть больше, то уже надо будет пилить 2 |
Ластро
|
|
Вот эти utils, для начала и выкинуть в отдельный файл. Чтобы они не загораживали основной алгоритм. |
Ластро
|
|
> "один файл - один класс
Шутки шутками, а отход от этого принципа, для того же qt может приводить к проблемам линковки. И ошибка выдваемая компилятором нифига не очевидна. |
Facensearo Онлайн
|
|
> Вот эти utils, для начала и выкинуть в отдельный файл. Чтобы они не загораживали основной алгоритм.
А зачем? Для пуризма? Что они загораживают, кроме круга для тараканьих бегов в голове? А несколько скриптов, особенно если их надо распространять среди, хм, разнообразно сведущих в ит специалистов-отраслевиков - это больше проблем, чем кажется. > Шутки шутками, а отход от этого принципа, для того же qt может приводить к проблемам линковки. И ошибка выдваемая компилятором нифига не очевидна. Ну давай еще удивительную линковку С++ вспомним и — особенно — студиевские дефолтные прекомпилированные заголовки, у меня от букв LNK2001 до сих пор на жопе волосы шевелятся. Только причем тут раби-скрипт на тыщу строк для биологов? 1 |
Ластро
|
|
>Ну давай еще удивительную линковку С++ вспомним
Это она и есть >А зачем? Для пуризма? Для читаемости. Поверишь или нет, но я в этом отношении не самый запущенный случай. Вон Боб Мартин в своём «Чистом коде» советует следующее о длине функций: Первое правило: функции должны быть компактными. Второе правило: функции должны быть еще компактнее. … Из сказанного выше следует, что блоки в командах if, else, while и т.д. должны состоять из одной строки, в которой обычно содержится вызов функции. Это не только делает вмещающую функцию более компактной, но и способствует документированию кода, поскольку вызываемой в блоке функции можно присвоить удобное содержательное имя. А ещё предлагает использовать функции, одного, ну максимум двух аргументов.Про длину файлов у него тоже было. В общем предлагаю свернуть тему. Ибо холиварная а все останутся при своём. |