swizard ([info]swizard) wrote,
@ 2008-03-03 14:59:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Current location:Home
Current music:Threshold / The Ravages Of Time
Entry tags:bugs, c++, code, daily, typing

Строгая типизация?
Закончил недавно относительно большой проект по работе -- ~10k строк на несколько подзабытом мной C++.

Дабы не было совсем скучно, решил использовать исключительно статический полиморфизм -- вышло даже достаточно удобно, в итоге virtual даже не понадобился ни разу. Единственно, немного напрягли сначала длиннющие сообщения об ошибках, но я их достаточно быстро научился читать.

Но суть не в этом. Я заметил достаточно любопытную вещь: единственный серьезный баг, на поиск которого я потратил почти два дня, был связан с логической ошибкой -- забыл внести один вызов внутрь блока if, оставив его снаружи. Код, тем не менее, был абсолютно корректен и даже выглядел правильным :)

Количество ошибок, связанных с типизацией: 0. Даже после рефакторингов :)

Не, может, конечно, это я так излишне аккуратно пишу, но все-таки, имхо, вся эта серьезная возня вокруг строгой типизации несколько превышает реальную необходимость. Да, это серьезный бонус для оптимизирующего компилятора, но для программиста я особых "overkill" прелестей на практике не вижу. Хотя, конечно, pattern matching и Maybe вместо NULL жизнь облегчает :)



(Post a new comment)


[info]potan
2008-03-03 01:45 pm UTC (link)
"Длиннющие сообщения" о несерьезных ошибках? И есть уверенность, что одну такую ошибочку не пришлось бы потом пол дня искать, если бы не компилятор?

if наверняка без {} написал :-). В FreeBSD coding style требует отсутствия скобок, если оператор в ifе единственный. В результате даже очень хорошие программисты пытаются туду добавить второй, забыв добавить скобки.

Я такой аккуратностью похвастаться не могу. Мне типизация сильно в отладке помогает. На C++, правда, много ошибок связанных с "политикой владения" бывает (эх, надо на Cyclone переходить).

(Reply to this)(Thread)


[info]swizard
2008-03-03 02:02 pm UTC (link)
> "Длиннющие сообщения" о несерьезных ошибках? И есть уверенность, что одну такую ошибочку не пришлось бы потом пол дня искать, если бы не компилятор?

В моем случае, это, в основном, были забытые manual template instantiation (хз как это перевести) -- я библиотеку делал. Так что без компилятора явные ошибки бы вылезли при первом же запуске программы :)

> if наверняка без {} написал :-) В FreeBSD coding style требует отсутствия скобок, если оператор в ifе единственный. В результате даже очень хорошие программисты пытаются туду добавить второй, забыв добавить скобки.

Странно. FreeBSD coding style заодно требует табуляцию в 8 пробелов, так что очень сложно не заметить, что оператор не попал в блок if :) Не, у меня там был {}, просто я уже в готовый код if добавлял, и потом часть операторов внес в блок, а один забыл (то ли промахнулся, то ли тупняк нашел какой-то).

> Я такой аккуратностью похвастаться не могу. Мне типизация сильно в отладке помогает.

Ну я там указал "имхо" =) Вообще у меня и на динамических языках проблемы с типизацией очень редко встречались. Мб просто помогает привычка, приобретенная в лисповом репл -- сразу проверять, как только напишешь минимальную единицу кода. В С++, правда, это не репл, а дебаггер, медленно и не очень удобно, но терпимо :)

(Reply to this)(Parent)


[info]thesz
2008-03-03 02:14 pm UTC (link)
"Количество ошибок связанных с типизацией - 0"

1) Это потому, что тебе их все выловили,
2) C++ не проверяет хотя бы "достаточно хорошо."

Напиши проектик на 1K строк на Хаскеле или Камле. Все будет совсем по-другому.

(Reply to this)(Thread)


[info]swizard
2008-03-03 03:11 pm UTC (link)
> 1) Это потому, что тебе их все выловили

Я их просто не совершил =)

> 2) C++ не проверяет хотя бы "достаточно хорошо."

Тоесть, ошибки у меня все-таки есть, но не обнаружены и всплывут потом? :)

> Напиши проектик на 1K строк на Хаскеле или Камле. Все будет совсем по-другому.

Я с радостью, только пока времени маловато. К тому же, это только докажет, что в сильная типизация хорошо помогает в хаскелле или камле :)

(Reply to this)(Parent)(Thread)


[info]thesz
2008-03-03 04:51 pm UTC (link)
Я имел в виду, что то, что обычно ловится проверкой типов, ты ловил с помощью отладчика (REPL). Потому, что плюсы проверяют плохо.

Во-во. Ты взял в качестве примера плохой вариант статической проверки типов и на основании этого делаешь далеко идущие выводы.

(Reply to this)(Parent)(Thread)


[info]swizard
2008-03-03 08:41 pm UTC (link)
Я не делаю далеко идущих выводов, я просто в очередной раз отметил, что конкретно я совсем не страдаю от слабой типизации :) И посему никак не могу понять, почему мощную типизацию считают оверкиллом.

(Reply to this)(Parent)(Thread)


[info]thesz
2008-03-03 09:08 pm UTC (link)
Вот этот твой комментарий совершенно не совпадает по смыслу с вот этим вот твоим постом.

(Reply to this)(Parent)(Thread)


[info]swizard
2008-03-04 01:56 am UTC (link)
Я написал ровно то же, что и в посте.

(Reply to this)(Parent)(Thread)


[info]thesz
2008-03-04 03:15 am UTC (link)
В посте: "...вся эта серьезная возня вокруг строгой типизации несколько превышает реальную необходимость..."

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

В посте читаем "строгая типизация - побрякушка, не стоит возни," в комментарии - "почему другие считают ее излишеством, мне не понятно."

Или я как-то неправильно тебя прочитал?

(Reply to this)(Parent)

ой тока бы флейм не разгорелся...
[info]kmmbvnr
2008-03-04 07:12 am UTC (link)
>>"Количество ошибок связанных с типизацией - 0"
>>серьезный баг, на поиск которого я потратил почти два дня, был связан с логической ошибкой
>>Напиши проектик на 1K строк на Хаскеле или Камле. Все будет совсем по-другому.

Статическая типизация все равно не помогает программе соответствовать техзаданию. Но тут от задачи зависит. Есть вещи которые со статической типизацией делать гооораздо проще.


(Reply to this)(Parent)(Thread)

Re: ой тока бы флейм не разгорелся...
[info]thesz
2008-03-04 07:23 am UTC (link)
Во.

Я, например, сейчас внимательно смотрю на зависимые типы данных, это, так сказать, пик проверки типов.

Для встраиваемых систем самое то - что время отклика можно проверить, что расход памяти.

(Reply to this)(Parent)


[info]redchrom.info
2008-03-03 02:41 pm UTC (link)
Ну дело думаю не в динамическом или статическом полиморфизме, а пожалуй в твоей аккуратности :) Для себя я учёл, что главное избегать кучи зависимостей между компонентами во избежание побочных эффектов и огромных деревьев наследования. Но для написания библиотек статичный полиморфизм подходит определённо лучше, так можно играться ещё и с разными политиками-темплэйтами. Да и к слову про всякие сегфолты я вообще почти забыл, вылазят только когда косячу в обёртках к сишным либам.
П.С. Неужели не одного virtual? Даже CRTP (http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern) не использовал?
П.П.С. Boost существенно облегчает жизнь, меньше _своих_ костылей - чище и читаймее код.

(Reply to this)(Thread)


[info]swizard
2008-03-03 03:08 pm UTC (link)
> Для себя я учёл, что главное избегать кучи зависимостей между компонентами во избежание побочных эффектов и огромных деревьев наследования.

У меня имхо, что главное -- это максимально возможный code reuse, но только без фанатизма :)


> Неужели не одного virtual? Даже CRTP (http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern) не использовал?

Неа :) Из всей этой магии только mixin'ы пригодились, и даже очень в тему оказались.


> Boost существенно облегчает жизнь, меньше _своих_ костылей - чище и читаймее код.

Возможно, но у нас в компании его люто ненавидят =) Почему так, я сам особо не понял, но, видимо, были какие-то прецеденты :)

(Reply to this)(Parent)


[info]float_dublin
2008-03-03 06:50 pm UTC (link)
черт. а у меня 120килострок. серверная часть. питон, плюсы с бустом, шелл. всё в перемешку. как бы его тоже "закончить" нафиг. :(

(Reply to this)(Thread)


[info]swizard
2008-03-03 08:38 pm UTC (link)
А тебе в таком масштабе слабая типизация очень жизнь отравляет, или проблемы скорее другого плана? :)

(Reply to this)(Parent)(Thread)


[info]float_dublin
2008-03-04 07:12 am UTC (link)
тама проблемы сразу всех планов одновременно.

(Reply to this)(Parent)


[info]makcnmka
2008-03-04 05:10 am UTC (link)
Уже год на работе с паттернами вожусь... Скоро на sourceforge выложися! До сих пор не понимаю - кому нужен такой сложный код?... =( Всё это уже давно прекрасно работает и просто пишется на других языках более высокого уровня.

(Reply to this)


[info]kmmbvnr
2008-03-04 07:05 am UTC (link)
>>единственный серьезный баг, на поиск которого я потратил почти два дня, был связан с логической ошибкой

Тесты не писал? Они как раз хорошо локализуют такие ошибки. Ну а с тестами проверка "типизации" получается на халяву.

(Reply to this)


[info]makcnmka
2008-03-04 11:05 am UTC (link)
В паттернах проектирования как нигде больше актуально высказывание программиста: "Программа работает", которое означает в переводе на обычный человеческий язык - "Программа компилируется" =)

(Reply to this)


Create an Account
Forgot your login?
Login w/ OpenID
English • Español • Deutsch • Русский…