Re[5]: Кто как пишет код
От: Sinix  
Дата: 19.12.09 04:00
Оценка:
Здравствуйте, jenyavb, Вы писали:

S>>Вот вам практический пример.

S>>Придумаете как это написать красивее?

J>Избавился бы от делегатов в пользу лямбд и от ref-параметров в пользу возврата звачений.

WTF??? Вы имеете в виду использовать сокращённый синтаксис без слова delegate?
(есть ref-параметры — надо явно указывать типы всех параметров). Как избавиться от ref, помимо генерации кучи структур/классов только для передачи параметров —

J>Ну и вообще может быть стоило бы придумать универсальный алгоритм для обхода деревьев со значением-аккомулятором.

Универсальный алгоритм... это будет хелпер для хелпера для хелпера. Нафиг-нафиг.
Re[4]: Кто как пишет код
От: yumi  
Дата: 19.12.09 13:16
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>А у меня увеличивается, поскольку все больше ухожу в экспериментальные области. Ну, конечно же никакой код я не удаляю, он просто скапливается в неком отстойнике, но продакшен идут только тщательно отполированные вещи. Года полтора назад ездил на интервью в Autodesk и беседовал с ихним CTO. Так он тоже очень любит программировать и отрабатывать всяческие идеи. Но конечно же, ни одной строчки из его кода не идет в продукты — если что-то и получается, то все тщательно передизайнивается и переписывается другими людьми. В общем-то, я стремлюсь к тому же, то есть, фактически к нулевой производительности.


Кстати, у меня сейчас нечто похожее. В данный момент пишем на С++ и своем DSL, я свои идеи пишу на С++ и отдаю своим коллегам (хотя пишу я уже редко), а они уже все это дело доводят до ума. И только недавно заметил, что в С++ я вообще, ни разу не использую оператор delete Зато оператор new использую с избытком. И garbage collector никакой не нужен
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[6]: Кто как пишет код
От: jenyavb  
Дата: 19.12.09 14:14
Оценка:
Здравствуйте, Sinix, Вы писали:

J>>Избавился бы от делегатов в пользу лямбд и от ref-параметров в пользу возврата звачений.

S>WTF??? Вы имеете в виду использовать сокращённый синтаксис без слова delegate?

И ещё использовать Func/Action вместо создания типов-делегатов.

S>(есть ref-параметры — надо явно указывать типы всех параметров).


В лямбдах типы можно указывать явно.

S>Как избавиться от ref, помимо генерации кучи структур/классов только для передачи параметров —


Ну вот над этим я бы и подумал, ref в публичном методе, это имхо не хорошо.

J>>Ну и вообще может быть стоило бы придумать универсальный алгоритм для обхода деревьев со значением-аккомулятором.

S>Универсальный алгоритм... это будет хелпер для хелпера для хелпера. Нафиг-нафиг.

Так это наоборот же хорошо.
Re[5]: Кто как пишет код
От: McSeem2 США http://www.antigrain.com
Дата: 19.12.09 15:37
Оценка:
Здравствуйте, yumi, Вы писали:

Y>Кстати, у меня сейчас нечто похожее. В данный момент пишем на С++ и своем DSL, я свои идеи пишу на С++ и отдаю своим коллегам (хотя пишу я уже редко), а они уже все это дело доводят до ума. И только недавно заметил, что в С++ я вообще, ни разу не использую оператор delete Зато оператор new использую с избытком. И garbage collector никакой не нужен


new/delete в прикладном коде — это вообще моветон. Надо пользоваться контейнерами.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[4]: Кто как пишет код
От: VoidEx  
Дата: 19.12.09 17:27
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Вот вам практический пример.

S>Есть регулярная задачка "обойти структуру папок и сгенерить аналогичную структру, но с другими данными".
S>При этом
S>а) некоторые папки надо пропустить.
S>б) имена папок/файлов в папке назначения могут различаться и об этом надо знать вызывающему коду.

S>
S>// skipped
S>


Ух. А чем банальный фильтр + отображение не угодил?

data Tree a = Leaf a | Branch a [Tree a] deriving (Read, Show)

-- А вот и тот самый универсальный алгоритм обхода.
foldTree leaf _ (Leaf v) = leaf v
foldTree leaf branch (Branch v vs) = branch v $ map (foldTree leaf branch) vs

getDirectoryTree path = liftM (Branch path) subPaths where
    subPaths = do
        cts <- liftM (map (path </>) . filter (`notElem` [".", ".."])) $ getDirectoryContents path
        (files, dirs) <- mapM doesFileExist cts >>= return . (map fst *** map fst) . (filter snd &&& filter (not . snd)) . zip cts
        dirTrees <- mapM getDirectoryTree dirs
        return $ map Leaf files ++ dirTrees
filterDirectories f = foldTree (return . Leaf) (\d subs -> sequence subs >>= filterM f_ >>= return . Branch d) where
    f_ path = case path of
        Leaf file -> f file False
        Branch dir _ -> f dir True
mapDirectories f = foldTree (\file -> liftM Leaf (f file)) (\dir subs -> liftM2 Branch (f dir) (sequence subs))
eachFilePath f = foldTree f (\dir subs -> f dir >> sequence_ subs)

withDirectoryTree :: FilePath -> (FilePath -> Bool -> IO Bool) -> (FilePath -> IO FilePath) -> (FilePath -> IO ()) -> IO ()
withDirectoryTree path filterPath mapPath actPath = getDirectoryTree path >>= filterDirectories filterPath >>= mapDirectories mapPath >>= eachFilePath actPath


Использование:
withDirectoryTree "c:\\some\\folder" (\path b -> return (b || path =~ ".mp3")) (\path -> return $ replaceExtension path "exe") putStrLn
Re: Кто как пишет код
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 20.12.09 21:18
Оценка: 1 (1)
Здравствуйте, Lonely Dog, Вы писали:

LD>Привет!


LD>Есть пара вопросов по предпочтениям к организации своего труда:

LD>1. Как вы относитесь к многозадачности? Есть люди, которые не могут делать больше одной задачи одновременно. Есть те, кто могут.

Как делать больше одной задачи непрерывно-параллельно во времени, я хз, это выше моего понимания. Если речь о частом переключении (несколько раз за час) между различными нетривиальными задачами, то долгое время считал это для себя невозможным, т.к. при переходе к новой задаче приходилось долго и мучительно въезжать в ее суть и вспоминать, на чем я там остановился последний раз. Ну и времени в итоге уходило куда больше, чем с последовательным подходом. Относительно недавно подумал (начитавшись GTD), почему бы не реализовать у себя оператор yield и не сохранять состояние задачи при переключении, где-нибудь вне своей головы. Как ни странно, но для меня это сработало. Применительно к коду, перед тем, как переключиться на другую задачу, я оставляю коммент там, где закончил до точки с запятой, типа:

//YIELD: представлять каждый параметр HTTP-запроса в виде списка со всеми возможными вариантами его декодирования в каноническую форму


Место это коммента однозначно говорит мне о том, где я закончил писать, а суть — что именно я должен тут написать, когда вернусь к этой задаче. Что-то типа "следующих действий" по GTD в микромасштабе, короче. Теперь, вернувшись к этой задаче, я буду точно знать где и что мне необходимо сделать.

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

LD>2. Как вы пишите код? Я предпочитаю написать кусочек (законченный), протестить его и двигаться дальше. Мне так удобнее. Знаю, что есть люди, которые могут неделю писать код, а потом его начинают отлаживать. Эти люди говорят, что им тяжело переключаться с задачи разработки (дизайна) на отладку.


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

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[5]: Кто как пишет код
От: Sinix  
Дата: 21.12.09 01:12
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Ух. А чем банальный фильтр + отображение не угодил?


Тем, что фильтр шарит состояние с обработкой. Можно конеш, но придётся гаранировать ленивую обработку.
Re[6]: Кто как пишет код
От: yumi  
Дата: 22.12.09 10:43
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>new/delete в прикладном коде — это вообще моветон. Надо пользоваться контейнерами.


я что-то пропустил? Можете подробнее раскрыть тему?
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[7]: Кто как пишет код
От: FR  
Дата: 23.12.09 10:00
Оценка: 4 (1)
Здравствуйте, yumi, Вы писали:

MS>>new/delete в прикладном коде — это вообще моветон. Надо пользоваться контейнерами.


Y> я что-то пропустил? Можете подробнее раскрыть тему?


Умные указатели + контейнеры для прикладного кода практически полностью исключают необходимость
в delete, new конечно используется но только в конструкторах этих самых умных указателей.
Ну и основная причина (кроме сложности следить за временем жизни вручную) это то что такой
стиль позволяет автоматически писать безопасный и корректный в отношении исключений код.
Re[8]: Кто как пишет код
От: yumi  
Дата: 23.12.09 12:04
Оценка: :)
Здравствуйте, FR, Вы писали:

Y>> я что-то пропустил? Можете подробнее раскрыть тему?


FR>Умные указатели + контейнеры для прикладного кода практически полностью исключают необходимость

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

А, всего-то А то я подумал, нечто новое и клевое появилось
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re: Кто как пишет код
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.12.09 20:18
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>1. Как вы относитесь к многозадачности? Есть люди, которые не могут делать больше одной задачи одновременно. Есть те, кто могут.


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

LD>2. Как вы пишите код?


Сам понимаешь, на такой общий вопрос ответить невозможно.

LD>Я предпочитаю написать кусочек (законченный), протестить его и двигаться дальше. Мне так удобнее.


ИМХО вопрос опыта. Чем больше опыт, тем больше такие кусочки. А так все правильно, только это лишь один аспект из множества. В agile, к примеру, подобный подход трактуется несколько более специфично.

LD> Знаю, что есть люди, которые могут неделю писать код, а потом его начинают отлаживать.


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

LD> Эти люди говорят, что им тяжело переключаться с задачи разработки (дизайна) на отладку.


ИМХО, это опять вопрос опыта.
... << RSDN@Home 1.2.0 alpha 4 rev. 1324 on Windows 7 6.1.7600.0>>
AVK Blog
Re[2]: Кто как пишет код
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.12.09 20:28
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Главное, что я для себя выяснил — никогда не откладывать последний этап "на потом". Так и останетесь с горой неподдерживаемого кода.


А что мешает сразу писать хорошо?
... << RSDN@Home 1.2.0 alpha 4 rev. 1324 on Windows 7 6.1.7600.0>>
AVK Blog
Re[6]: Кто как пишет код
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.12.09 20:28
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S> Как избавиться от ref, помимо генерации кучи структур/классов только для передачи параметров —


ref очень сильно загаживает использующий код. Так что, если метод вызывается хотя бы в паре мест, таки лучше объявить класс. Либо использовать анонимные типы.
... << RSDN@Home 1.2.0 alpha 4 rev. 1324 on Windows 7 6.1.7600.0>>
AVK Blog
Re: Кто как пишет код
От: _FRED_ Черногория
Дата: 28.12.09 07:58
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Есть пара вопросов по предпочтениям к организации своего труда:

LD>1. Как вы относитесь к многозадачности? Есть люди, которые не могут делать больше одной задачи одновременно. Есть те, кто могут.
LD>2. Как вы пишите код? Я предпочитаю написать кусочек (законченный), протестить его и двигаться дальше. Мне так удобнее. Знаю, что есть люди, которые могут неделю писать код, а потом его начинают отлаживать. Эти люди говорят, что им тяжело переключаться с задачи разработки (дизайна) на отладку.

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

При проектировании бывает, неделю можно писать, ни разу не запустив даже компилятор.
Бывает что наоборот, говорю, что "эта задача должна отлежаться, не напрягайте пока с ней, я посмотрю на неё через пару деньков" и берусь за что-то другое. Это позволяем по-свежему взглянуть на что-то долгоделающееся.
Когда-то наоборот приходится просить, что бы ничем не отвлекали от той задачи, что делается сейчас, а то ничего хорошего не получится — мысль упущу.
Некоторые задачи получается решить наоборот — не долгими экспериментами и проектированиями, а множеством мелких разноплановых, но направленных на одно решение изменений. Это проведение рефакторинга, когда из множества изменений каждое не слишком велико, но множество их позволяет существенно "внутри" переделать код.

То же самое и с отладкой и тестированием. Когда-то, что бы двигаться дальше надо сначала убедиться, что всё сделанное сейчас работает правильно, а когда-то это не важно — нужно набросать общую картину, потом докорректировать её, довести до ума и тогда уже тестить.

ИМХО, более интересный вопрос — не то, "как вы решаете задачи", а "как вы принимаете решение, каким образом лучше решить данную задачу в данном проекте в данное время (за назначенный срок :о) )"
Help will always be given at Hogwarts to those who ask for it.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.