- 1
- 2
- 3
class Govno {
virtual void govno() = 0;
};
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−1
class Govno {
virtual void govno() = 0;
};
Откуда такой дурацкий синтаксис? ))
Прочитал у страуса, джва дня смеюсь.
Может кто-то знает причину?
Ну а сам все налегает На селедку иваси!
© Леонид Филатов
именно abstract, как идиомы. Но получается, что для того, чтобы понять, что экземпляры класса нельзя создавать, нужно проверить, не присваивается ли какому-то из его методов нуль ))) Лол.
Эта пизда мне не давала в мост в антед иградь. Помницца на кабре была стотья, где чувак в лолидебагере испражнялсявлял эту ошипко.
P.S. мне не смешно было, пофигу собственно.
Вряд ли, скорее это легаси, о котором говорит борманд.
Если б уж экономить слова, можно просто оставить виртуальный метод без какой бы то ни было реализации, чтобы обязать неабстрактных потомков его реализовать. В такой ситуации накакой '= 0' бы не понадобился, насколько я понимаю, и вышло бы короче. Похоже, когда-то кому-то хотелось срать в vtable руками. А сейчас это всё ещё можно?
Давайте же обратимся к The Design and Evolution of C++:
13.2.3 Syntax
The curious = 0 syntax was chosen over the obvious alternative of introducing a keyword pure or abstract because at the time I saw no change of getting a new keyword accepted. Had I suggested pure, Release 2.0 would have shipped without abstract classes. Given a choice between a nicer syntax and abstract classes, I chose abstract classes. Rather than risking delay and incurring the certain fights over pure, I used the traditional C and C++ convention of using 0 to represent "not there".
Шах и мат, аметисты.
Хорошо ещё, что они это PURE не назвали, = 0 гораздо лучше.
this.
Звук косания говна с поверхностью воды унитаза?
И этим экспертом будет инканус грей.
Да ну, нормально работает на 32 гигах.
Хранитель жаренного мяса?
> System Administrator
Наконец-то, хоть к кому-то можно обратиться.
Вот тебе смешно, я пользовался Rational ClearCase и писал ишью в ClearQuest мохнатой версии (там по умолчанию ещё везде был моноширинный шрифт, а Esc сразу удалял весь комментарий, который ты пишешь. Меня, как пользователя Vim, это тогда невероятно радовало).
Отражает наглядность и интуитивность этой софтины?
{
}
Ну кстати та версия, которой я пользовался, насколько я помню, была очень простой, чуть ли не проще багзилы. Но потом её начали заменять каким-то самописным индусским жабоговном, которое я очень слабо помню. Вот там было не интуитивно.
Может, СНаУТ помнит.
Ага, оно.
А вы что, вместе работали? Или это что-то велл-ноун?
Это что. А я из неё ещё отчёты генерил, вот где был АДЪ.
Что? Всего одна роль? Они там вообще не тестируют что ли?
- Test Automation Engineer
- Test Automation Architect
- Test Tool Engineer
- Test Suite Responsible
- Test Specification Writer
- Test Engineer
Ну это так, для начала.
Почему. Скорее если у софтины есть строго сформулированные в ТЗ требования к дизайну (например, это модный мессенджер на электроне или мобильное приложение на триллиард пользователей, которое ребрендится), Test Graphic Artist может проверять работу другого художника, подходит ли она под требования закащщика к юзабилити или там ещё чему-нибудь. То есть логика. A делает по специальности, test A проверяет то, что делает А по специальности. А твоё предположение про редактор, там тестер, я так понял, должен рисовать в редакторе свои рисунки чтобы протестить, удобно ли? Чо-то не то, как-то ломает консистентность. Скорее уж он будет консультантом при разработке ТЗ, раз знает предмет.
Под моим окном
Принакрылось снегом,
Точно серебром.
На пушистых ветвях,
Снежною каймой
Распустились не дольше чем за O(log n) кисти
Белой бахромой.
И имена вообще везде надо писать?
Если опционально, то в питоне и scala тоже все аргументы именованы.
О ужос, а нах?
И без имён этих, вообще вызвать нельзя? Ну, если ты порядок аргументов помнишь. А почему просто имя переменной (title, petuh) не делать собственно и именем параметра?
Как в смольолке же, вместо вызова метода шлют сообшения объектам.
Немного напоминает ситуацию с питоном 2 и 3
Насест?
Это наверное тот чувак с говнокода, который недавно гуглил как выскочить замуж за программиста.
-Это дествительно похоже на поведение приматов?
- А что это означает когда примат в примата кидает какахи?
Я джаву учу вообще.
Я это сразу понял, но как пишет ниже борманд, вроде как это не баг:
- стандартизирован размер примитивных типов
- всюду левая ассоциативность (стандартизирован порядок вычислений)
- нет перегрузки операторов
- нельзя кастовать массивы примитивных типов
- ничто не приводится к логическому типу
- нет перекрытия имен сущностей
- только ковариантность в полиморфизме
Единственное, что мешает ему быть совсем примитивным -- это наличие, внезапно, примитивных типов. Ну допустим. А в целом он довольно неплохо изгоняет демонов из крестов. Ну в общем-то и хуй с ним. Много воды, но кроме объёма кода, багам больше негде спрятаться в какой-нибудь сложной логике взаимодействия чего-то с чем-то. Всё вроде как написано, и только то, что написано, то и происходит.
Вроде как статическому анализу тоже хорошо подвергается. Хотя явных приведений типов многовато.
В общем, идея сделать ваще тупой язык, на котором чтобы писать нужно знать три конструкции, пару концепций общих и ОГРОМНУЮ СТАНДАРТНУЮ БИБЛИОТЕКУ мне нравится, как альтернатива языкам, где надо знать миллиард конструкций, специальных синтаксисов, частных случаев, неявных приведений.
Люблю я, разумеется, и то и то. Просто говорю, что жаба более чем имеет право на жизнь, кмк.
Вредно говорить на языках, продолжения которых не знаешь.
Plain C с RAII на макросах
Ни к чему нельзя, насколько я понял. Может у меня старая инфа, сейчас проверю, но вроде нельзя, например, массив байтов превратить в массив интов кастом.
Я перечислял не плюсы, а упрощения по отношению к языкам, которые на джаву повлияли
> не понял.
В большинстве языков у тебя может быть например переменная А в классе и переменная А как параметр метода. Если есть такая ситуация, другие языки просто выбирают более специфическую (объявленную в более узкой области видимости) переменную. В Джава же такой код вызовет ошибку компиляции. Сущности с одинаковыми именами могут быть только в непересекающихся областях видимости.
Не скомпилируется: Скомпилируется: > Без них довольно сложно было бы
Да, причину, почему так сделали, я прекрасно понимаю. Более того, языки на основе джавы, типа скалы, где нет примитивных типов, что-то не сильно заметно ПРОЩЕ джавы.
Тот код, что я привёл, действительно не компилится. Но да, с параметрами работает, тут я пролечил. Короче, вот этот кусок кода: в С++ скомпилится, а Java даст error: variable a is already defined. А вот такой сработает везде.
Никогда не понимал смысл контрвариантности, может пояснишь?
Вот я сделал полиморфную функцию, а зачем мне знать, что туда влезет какой-то класс и все его ПРЕДКИ. С потомками понятно, они гарантированно реализуют какой-нибудь контракт, имеют методы или поля. А обратно?
Не понятно.
Поэтому я за "ковариантность"
А, ну да. Спасибо.
in и out -- это хорошо, только если они не зарезервированы как ключевые слова, потому что иначе очень неприятно терять такие красивые имена переменных ((
in и так во многих языках проёбан, навскидку в js, в python...
Вот в скалке просто когда параметризуешь дженерик типом, к нему можно приписать ковариантность и контравариантность в виде [T], [+T] или [-T].
Рассмотрим предикат p : a -> Bool. Если он работает для a, его можно приспособить для чего угодно, из чего можно получить a.
т.е. есть функция contramap : (b -> a) -> (a -> Bool) -> (b -> Bool), которая может взять проекцию из b в a, предикат для a, и сделать предикат для b.
Если взять какой-нибудь compare : a -> a -> Bool, то он почти ничем не отличается от предиката, и с ним можно проделать такой же трюк.
Вырисовывается шаблон.
В убогой джаве мы не работаем с функциями высшего порядка, у нас нет никаких "проекций". Вместо этого у нас отношение "наследования", что по сути является очень специальной проекцией: из подтипа можно получить базовый тип. Из предиката T можно получить предикат T' extends T. Из Compare<T> можно получить Compare<T'>, где T' extends T.
В общем случае, то, что производит/содержит значения, как список, является ковариантным функтором (функция тоже производит, a -> b производит b). То, что потребляет значения, является контравариантным функтором (функция тоже потребляет, a -> b потребляет a). То, что умеет делать и то, и другое, функциональщики называют профунктором (функция, как ты видишь, является одним из простейших профункторов).
Т.е. контравариантность/ковариантность идут рука в руку. Ковариантность понимать почему-то проще, но она ничем не "лучше" своей дуальности, просто другая.
Так они и есть функции, из индекса/ключа в значение. Функция есть коллекция пар (a, b), где для каждого a ровно одно b, и любая коллекция с таким свойством есть функция.
В скалке даже синтаксис для обращения к массиву или мапе идентичен:
massiv(1)
mapa("kokoko")
Только это сахарок, в действительности функция будет функцией, а мапа или массив будет объектом с определенным методом apply, имя которого можно опускать, и получается синтаксис со скобочками.
В общем-то да, на редкость унылый и тупой пердолинг.
То ли дело разбираться, почему у тебя прод в корку падает, или приложение на новой версии ОС зависает, хотя раньше работало.
Что значит в корку?
Core Dump
Это да (
А у меня приложение по интеграции разбито на джавовскую и скаловскую части, так что можно иногда передохнуть, а ещё груви-свиток написать хуёвый.
Хуй знает. Не, не метапрограммировал ещё, так, методом тыка написал пару говноскриптов, чтобы на продакшен вкатить кучу сущностей из csv-файла, потому что просто sql там не подходил, нужно было создавать именно сущности проекта, у них многие поля при сохранении в базу заполняются автоматически.
Только шутку пока тупую про него придумал, что типа на самом деле этот язык и должен был называться JavaScript.
> Почти любой код на джаве валиден и для груви (но не наоборот)
как раз-таки Java, только Script и получается. Я не про экма, я про то, что вот как раз груви и следовало бы назвать джаваскриптом, потому что это скриптовой язык, который понимает джаву. Почти. В первом же свитке столкнулся с проблемой, что в груви не различаются литералы в одинарных кавычках. Чтобы написать чар приходится писать ('a' as char).
Ого метушатинкой пахнуло. Даже затрудняюсь предположить, чего хорошего можно таким способом сделать, кроме разве что невообразимо сложную загадку оставить коллегам, которым придётся поддерживать код. Скорее всего такой скрипт останется валяться как ненужное легаси которое всем лень выпилить, а его функционал полностью продублируют парой десятков бойлерплейтных классов где-нибудь в другом месте.
Читай пояснение к шутке
http://govnokod.ru/25097#comment441571
На месте iso я бы переименовал Groovy в JavaScript, а то что щас называется JS в ECMAScript, как и должно быть. И пусть петушки, которые хотят делать веб-морды на модном языке, гуглят и читают про метапрограммирование и нормальное ООП, может гляди и говна поменьше станет в мире. Здравый такой хаос.
Да в общем-то в итоге люди в общей массе просто спонсируют производетелей железа. Потому что из-за того же ГЦ всё что есть на джава и её потомках ещё и нельзя класть в свап. А пердолиться всем не охота.
в Форте вооюще нет ключевых слов. Именно поэтому я за "Forth".
А не читнуть ли вам стандарт, сударь?
Только делать все поля конст. Только это очень непрактично, проще экспортировать только конст-методы.
К примеру, объекты с конст-полями ты даже толком в вектор не положишь (как мувать?).
мувать в другом смысле. Если ты объект из середины удалил, тебе всё подвинуть надо. Это и оператором присваивания сделать можно, без всяких std::move. Только конст-поля тебе этого не дадут сделать.
А мы их const cast'ом уломаем...
когда то, что ты кастишь, изначально не было объявлено как конст. а ещё им volatile выпиливать можно.
7.1.6.1 The cv-qualifiers.
3. A pointer or reference to a cv-qualified type need not actually point or refer to a cv-qualified object, but it is treated as if it does; a const-qualified access path cannot be used to modify an object even if the object referenced is a non-const object and can be modified through some other access path.
Закеширует конпелятор старое значение y и приехали...
7. Note: Dependng on the type of the object, a write operation through the pointer, lvalue or pointer to data member resulting from a const_cast that casts away a const-qualifier may produce undefined behavior.
И кроме того примера никаких подробностей про этот may нет... Примеры в крестостандарте являются нормативными?
Впрочем, ЕМНИП, const методы могут менять поля с модификатором volatile. По-видимому, тогда и компилятор экземпляр класса с volatile полями будет всегда размещать в обычной памяти.
Он про функции с const, которые навешивают const на *this.
А чего нехорошего-то? Для структур — самое оно, гораздо удобнее, чем писать унылый конструктор по-умолчанию.
Не знал он просто.
C++11.
А, свежатинка.
Ну так себе, уже 2 стандарта с тех пор вышло. Когда я только начинал писать на плюсцах где-то лет шесть назад, C++11 потихоньку уже внедрялся во многих местах.
Осталось дождаться = auto.
Дык так оно и есть. Скоро весь софт будет на экмаскрипте. Останется сделать аппаратный v8...
реализовать на чипе amperka-js
(кто-нибудь в курсе истории, как в последнюю минуту переделали процессор бытового компьютера БК-0100ноль11что-то там10, потому что какому-то руководству внезапно показалось, что надо испортить все прежние наработки, и сделать его как ПДП-11, только лучше, якобы для совместимости софта, которая так никогда и не появилась, разумеется?)
Джорджия и Грузия
Македония и Македония
Ирландия и Ирландия
Да для крестов уже есть LLVM. Годен.
Ну его таки можно гонять в режиме интерпретации или JIT'а. Чем не VM?
- ограбили, растроился, - пошел посмотрел на карнавал с жопами и сиськами, уже не так растроен.