В первой части мы обсудили, как добиться переноса определения шаблона фунции из заголовочного файла в исходник, если набор типов, для которых должен быть инстанциирован шаблон известен заранее. В этой части мы посмотрим, как добиться этого красиво.
Читать полностью »
Рубрика «ненормальное программирование» - 85
Инстанциирование шаблонов функций по списку типов (Часть 1)
2014-09-05 в 21:17, admin, рубрики: c++, ненормальное программирование, С++Случалось ли Вам писать шаблон функции, который должен быть инстанциирован для определённого набора типов и больше ни для чего? Если нет, то эта статья врядли покажется Вам интересной. Но если Вы всё ещё здесь, то тогда начнём.
Cтатья будет состоять из двух частей. В первой части будет описана проблема и представлено её первичное, немного кривоватое, решение. Вторая часть будет посвящена усовершенствованию и обобщению изложенного решения.
Первым делом опишем проблему. Представьте себе, Вы обьявляете шаблон функции в заголовочном файле. Если шаблон должен быть потенциально пригоден для всего, что только можно, то и определить его нужно здесь же, в заголовочном файле. Это влечёт за собой сквозные зависимости, увеличение времени компиляции и срач в заголовочном файле. Но это всё же неизбежность. Конечно, можно определить шаблон в другом заголовочном файле и включить его внизу файла с обьявлением. Это избавит Вас от третьей проблемы, но не избавит от первых двух. Теперь обратная ситуация, когда шаблон должен быть использован(инстанциирован) только для парочки конкретных типов. Тогда вы смело переносите определение в исходник и явно инстанциируете Ваш шаблон для каждого отдельного типа. Немного трудоёмко в сопровождении, но всё же лучше чем гадить в заголовочном.
Наша ситуация находится где-то посередине. Есть шаблон функции, и он должен быть инстанциирован для конкретного списка типов, который где-то у Вас в проекте увековечен с помощью typedef'а. Ну, например:
typedef TypeList<int,char,bool,string, EmptyList> MyTypeList.
О том, что такое список типов можно почитать у А.Александреску в «Современное проектирование на С++», а пример реализации — здесь.
Под катом самопальная имплементация(такая же как и у тысяч других, наверное). Она, мне лично, больше нравится, так как позволяет писать
typedef TypeList<int,char,bool,string, EmptyList> MyTypeList;
вместо классической записи
typedef TypeList<int,TypeList<char,TypeList<bool,TypeList<string, EmptyList>>>> MyTypeList;
Котфускация исполняемого .net кода
2014-08-29 в 10:23, admin, рубрики: .net, котики, ненормальное программирование, Стеганография(пятница)
Обычно развернутое приложение в файловой системе выглядит как-то так:
Совершенно незащищенное от инструментов типа рефлектора или IlSpy, но что если оно станет таким:
По крайней мере легкий ступор хакеру-неофиту обеспечен. Приятно смотрится, и антивирусы не заинтересуются.
Дао программирования, часть 2
2014-08-27 в 19:14, admin, рубрики: да пребудет с тобой сила, ненормальное программирование, так говорил заратустра, управление проектами
Книга 4
Кодим
И сказал Великий Программист: «Хорошо написанная программа сама себе Рай. Плохо написанная программа сама себе Ад»
4.1
Программа должна быть лёгкой и гибкой, а подпрограммы её – словно нанизанные на нить жемчужины. Дух и цель программы должны быть сохранены на всём её протяжении. Кода не должно быть слишком много или слишком мало. Ни ненужных циклов, ни бесполезных переменных. Ни хаотичности, ни излишней структурированности.
Программа должна следовать правилу «наименьшего удивления». Это значит, что программа должна отвечать на действия пользователя способом, наименее удивительным для него.
Программа любой сложности должна работать как целое. Работа программы диктуется логикой, а не внешними признаками.
Если программа не удовлетворяет этим требованиям, это ведёт к беспорядку и путанице. Остаётся лишь переписать её заново.
Читать полностью »
Что нужно для ЯП
2014-08-21 в 12:33, admin, рубрики: ненормальное программирование, Программирование, языки программирования
Дорогой %username%, если ты решишь сделать свой ЯП(язык программирования), с преферансом и балеринами, или понять некоторые основы работы препроцессора, компилятора и выполнения программы, тебе сюда!
EFFE Script — упростить синтаксис C# без потери качества
2014-08-13 в 12:14, admin, рубрики: .net, monogame, xna, ненормальное программирование, Программирование, скриптовый язык
Здравствуйте. Я программист инди игр. И мне всегда нравилось создавать игры в одиночку (по многим причинам). Так как мой первый язык программирования был C#, я начал делать игры на платформе XNA (сейчас перешел на MonoGame). Однако за два года создания игр я понял, что даже на самом удобном (для меня) языке C# и не сложной платформе XNA мне было сложно писать одному большие инди проекты.
Я не люблю мини игры. Если начинаю делать какую-нибудь игру, то по пути её разработки постоянно добавлял всё больше и больше контента. А чем больше проект, тем дольше его тестировать, дольше искать баги, сложнее следить за добавлением нового контента. Я не хотел тратить много времени на один проект, потому-то был ленив и хочу создать много различных игр. И вот, просматривая код своего проекта, я понял, как выбраться из этой ситуации — создать свой язык программирования.
Читать полностью »
Статически типизированные продолжения
2014-08-12 в 16:08, admin, рубрики: c++, high order function, ненормальное программирование Намедни на RSDN был задан такой вопрос:
Пусть у нас есть функция, возвращающая полиморфный тип
class Base { virtual int foo() const = 0; };
class A : public Base { int foo() const { return 1; } };
class B : public Base { int foo() const { return 2; } };
class C : public Base { int foo() const { return 3; } };
class D : public Base { int foo() const { return 4; } };
Base* getconfig(char cfg) // не будем пока отвлекаться на уборку мусора
{
switch(cfg)
{
case 'a': return new A();
case 'b': return new B();
case 'c': return new C();
case 'd': return new D();
default: throw std::invalid_argument("bad type");
}
}
и функция, принимающая его экземпляры
int entry(Base* x, Base* y) { return x->foo()*10 + y->foo(); }
которую используют примерно так
void run(char cx, char cy) { std::cout << cx << cy << " : " << entry(getconfig(cx), getconfig(cy)) << std::endl; }
Можно ли протащить полиморфизм на стадию компиляции?
Читать полностью »
Асинхронный JavaScript: без колбеков и промисов
2014-08-08 в 7:42, admin, рубрики: javascript, асинхронное программирование, ненормальное программирование, парсингНаверное, каждый, кто использовал JavaScript, когда-либо сталкивался (или столкнётся в будущем) с асинхронными вызовами. Может быть, это будет обращение к базе на стороне сервера. Может быть — работа с таймером для создания анимации на сайте.
Для того, чтобы «побороть» асинхронность, используются разные инструменты от промисов до смены языка программирования. Но иногда очень хочется бросить всё и написать на чистом JS линейный код:
timeout(1000);
console.log('Hello, world!');
Можно ли реализовать нечто подобное? Разумеется, можно.
В данной статье мы рассмотрим один опасный, но действенный способ.
Читать полностью »
D# — язык программирования для фанатов Doge
2014-08-04 в 21:01, admin, рубрики: much_code, much_debug, programming, such, wow, ненормальное программирование, Программирование Доброго времени суток. В прошлой своей статье я писал о эзотерическом языке программирования ArnoldC.
В этот раз речь будет о языке, основанном на популярном меме про собаку, породы Сиба-ину, Doge.
Как мы «дрессировали огненную обезьяну» или наш опыт работы с FMX
2014-08-02 в 19:57, admin, рубрики: Delphi, Блог компании Сфера системс, кроссплатформенность, ненормальное программирование
Доброго времени суток!
Мы — компания «Сфера системс», и сегодня мы открываем корпоративный блог на Хабре, в котором хотим познакомить вас с нашим проектом «Sphere Live». И, хотя наш проект пока находится в стадии бета тестирования, сейчас уже можно с уверенностью говорить о том, что он состоялся.
Мы планируем поделиться своим опытом создания стартапа, рассказать как об успешных решениях, так и об ошибках. И, конечно же, нам бы хотелось получить ответную реакцию. Мы отнюдь не претендуем на «историю успеха», по крайней мере пока, тем не менее, искренне надеемся, что наш опыт разработки окажется интересным нашим читателям, а их отзывы будут полезны для нас.
Первая публикация посвящена выбранному нами средству разработки. Возможно, наш выбор многим покажется, мягко говоря, неочевидным. Однако факт остается фактом, мы имеем реально работающий продукт. Но прежде несколько слов о нашем продукте, хотя бы для того, чтобы в общих чертах каждый смог понять, о чем идет речь.
Проект «Sphere Live» — это мультиплатформенная система организации видеоконференцсвязи с неограниченным количеством участников в форме симметричных и ассиметричных лекций с интегрированной биллинговой системой, функциями файлообмена и облачного хранилища, а также защитой информации о пользователе (переписка, отправленные и переданные файлы, видео- и аудиообщение).