Здравствуйте, ·, Вы писали:
·>Здравствуйте, licedey, Вы писали:
l>> Так вот суть в чем. Я понимаю, что уже сто лет как напридумывали всяких редмайнов, джир и фабрикаторов, со скрам бордами через плечо. l>> НО! Заказчик пишет — я хочу такую то фичу, она должна свистеть, а сзади у нее должен быть красненький мотор. Он уложился в три строки. И вроде с виду ·>Я как фанат ещё упомяну тесты (разных уровней Unit, Integration, Func, Perf, etc). Тесты тоже неплохой инструмент управления сложностью. Каждый тест по сути небольшая исполняемая программка, и вместо написания огромного сложного приложения ты пишешь сотни маленьких и простых. А собирать сложную конструкцию из простых и ожидаемо работающих
Кстати про тесты. Я в целом то с вами соглашусь, но сколько времени уходит на их написание? Когда ты один на один с заказчиком — плевать он хотел на тесты и все что под капотом, ну вы сами знаете. Важен бюджет и чтобы работало. Все. Вот хоть в нерабочее время эти тесты пиши.
И вот хотелось бы спросить еще, вы как фанат тестов, случаем не посоветуете тулзу которая под C#/Visual Studio бы генерила тесты. Не только стабы пустышки, а именно чтото сама додумывала и пыталась хоть немного покрыть функционал? Пойду конечно погуглю, но лучше спросить
Здравствуйте, licedey, Вы писали:
L>Прыг в UI, прыг в конфиги, прыг в класс модели, прыг в класс view-модели, назад в UI. И этот процесс цикличен. Между этими прыжками, можно потерять какую-либо деталь и вообще улететь в космос, размышляя о бытие.
На чем пишешь?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, licedey, Вы писали:
l> ·>Я как фанат ещё упомяну тесты (разных уровней Unit, Integration, Func, Perf, etc). Тесты тоже неплохой инструмент управления сложностью. Каждый тест по сути небольшая исполняемая программка, и вместо написания огромного сложного приложения ты пишешь сотни маленьких и простых. А собирать сложную конструкцию из простых и ожидаемо работающих
l> Кстати про тесты. Я в целом то с вами соглашусь, но сколько времени уходит на их написание?
От опыта зависит. Если есть опыт, то код с тестами как правило пишется быстрее. Т.к. значительно уменьшается время от внесения изменения до проверки как это изменение функционирует. Таких ситуаций "ой, опечатка! тут надо было +1, а не -1 написать! Ох... опять компилить, деплоить, запускать..." практически не остаётся — а таких опечаток очень много, съедают кучу времени.
l> Когда ты один на один с заказчиком — плевать он хотел на тесты и все что под капотом, ну вы сами знаете. Важен бюджет и чтобы работало. Все. Вот хоть в нерабочее время эти тесты пиши.
Тесты не должны идти отдельной строчкой бюджета, это неотъемлемая часть качественной разработки. Ты ж заказчику не просишь отдельно оплатить "использование VCS" или "написание осмысленных идентификаторов в коде". С другой стороны не каждому заказчику нужна качественная разработка... но надеюсь мы не о таких проектах говорим.
l> И вот хотелось бы спросить еще, вы как фанат тестов, случаем не посоветуете тулзу которая под C#/Visual Studio бы генерила тесты. Не только стабы пустышки, а именно чтото сама додумывала и пыталась хоть немного покрыть функционал? Пойду конечно погуглю, но лучше спросить
В идеале тесты до основного кода пишутся... На основе чего эта тулза должна генерить тесты? Если ты можешь генерить тесты, то чего уж — генери сам основной код... и покрой тестами генератор.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, licedey, Вы писали:
L>>Прыг в UI, прыг в конфиги, прыг в класс модели, прыг в класс view-модели, назад в UI. И этот процесс цикличен. Между этими прыжками, можно потерять какую-либо деталь и вообще улететь в космос, размышляя о бытие.
VD>На чем пишешь?
Зря шутишь. На немерле то как раз сложность обуздать по проще.
L>Ну в основном на C#/C++
С Плюсами все фигово по определению, а на Шарпе можно фичами РеШарпера пользоваться. Там для навигации много чего есть. В том числе и из гуя в код и обратно.
Еще есть способ работающий везде, но требующий пунктуальности. Используешь теги в коментариях типа
// #фича_ххх
Ну, и в остальных местах (треккер, гит, доки) используешь эти теги. При этом они должны быть уникальны, конечно. Далее тупой поиск позволяет найти все связанное.
Это и для плюсов катит.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, ·, Вы писали:
·>Здравствуйте, licedey, Вы писали:
l>> И вот хотелось бы спросить еще, вы как фанат тестов, случаем не посоветуете тулзу которая под C#/Visual Studio бы генерила тесты. Не только стабы пустышки, а именно чтото сама додумывала и пыталась хоть немного покрыть функционал? Пойду конечно погуглю, но лучше спросить ·>В идеале тесты до основного кода пишутся... На основе чего эта тулза должна генерить тесты? Если ты можешь генерить тесты, то чего уж — генери сам основной код... и покрой тестами генератор.
Ну я не фанат TDD, не понимаю как это делать. Читал, пытался писать сначала тесты, но привычка знаете, сначала формы шлепать, потом функционал потихоньку добавлять, а потом по требованию правой кнопочкой мыши и Generate Unit Test...
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, licedey, Вы писали:
L>>Nemerle
VD>Зря шутишь. На немерле то как раз сложность обуздать по проще.
Я не шучу, еще 4 года назад ваш парсер c# кода использовал в своем проекте. За что вам спасибо. Но помоему больше не доводилось нигде.
Как можно обуздать сложность, не спрашиваю, но можете рассказать.
L>>Ну в основном на C#/C++
VD>С Плюсами все фигово по определению, а на Шарпе можно фичами РеШарпера пользоваться. Там для навигации много чего есть. В том числе и из гуя в код и обратно.
Решарпер почему то у меня ассоциируется с громадной универсальной махиной, которая только тормозит студию. Я понимаю конечно, что продукт хороший и повсеместный,
но мне тот же visual assist ближе.
VD>Еще есть способ работающий везде, но требующий пунктуальности. Используешь теги в коментариях типа VD>
VD>// #фича_ххх
VD>
VD>Ну, и в остальных местах (треккер, гит, доки) используешь эти теги. При этом они должны быть уникальны, конечно. Далее тупой поиск позволяет найти все связанное. VD>Это и для плюсов катит.
делали клиент-серверный IDE-движок. В нем обработка кода ведется на сервере, а общение проводится через сериализуемые сообщения. В результате написали макро-атрибут NitraMessage, который будучи применен к типу генерирует для него эффективый код сериализации. В результате описание типов для сообщений стало выглядеть так:
[NitraMessage]
public struct FileEntries
{
public File : FileIdentity;
public Ranges : ImmutableArray[Range];
}
Конструктор так же генерируется автоматически.
Полный список всех типов умещается в одном файлике и отлично легко поддерживается.
Естественно, что сериализация это только пример. Ты можешь сгенерит все что угодно и иметь одни короткий исходник порождающий много кода.
Ну, и сам язык мощнее. Даже C# 7 не включает всех его фич. Да и 8 не будет.
L>Решарпер почему то у меня ассоциируется с громадной универсальной махиной, которая только тормозит студию. Я понимаю конечно, что продукт хороший и повсеместный, L>но мне тот же visual assist ближе.
Я использовал Visual Assist лет 15 назад. Тогда там функциональность была очень скудная и работал он со скрипом.
Решарпер сейчас работает довольно не плохо. Особенно на фоне новой менеджед-реализации самого Шарпа. И функциональность там просто запредельная.
Навигация очень удобная. Жмешь Ctrl+T и пишешь большие буквы ( hs для поиска HashSet) нужного тебе символа (без оглядки на его тип). Далее из списка выбираешь и ты уже там. Далее очень удобный переход по реализациям интерфейсов и виртуальных методов. Ну, и много всего.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
— десяток/два строк на непосредственно рекурсивный "движок", плюс само собой код сериализации базисных типов.
VD>Навигация очень удобная. Жмешь Ctrl+T и пишешь большие буквы ( hs для поиска HashSet) нужного тебе символа (без оглядки на его тип). Далее из списка выбираешь и ты уже там. Далее очень удобный переход по реализациям интерфейсов и виртуальных методов. Ну, и много всего.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, licedey, Вы писали:
L>>Как можно обуздать сложность, не спрашиваю, но можете рассказать. VD>Сам код макроса находится тут. VD>Естественно, что сериализация это только пример. Ты можешь сгенерит все что угодно и иметь одни короткий исходник порождающий много кода.
Из бенефитов я извлек только, что конструктор структуры генерится сам. Ну вникнуть конечно время надо и увидеть в действии. Почитаю на выходных getting started.
Работаю тут с человеком
VD>Ну, и сам язык мощнее. Даже C# 7 не включает всех его фич. Да и 8 не будет.
Спорить не буду, массовости не хватает, комьюнити. Чтобы зашел на SO, а там уже 25 ответов на твой вопрос. К слову, пришел несколько лет назад в Microsoft ua, и начал показывать им свой проект, который как я говорил в основе содержал ваш парсер. И они пожимали плечами при слове Немерле. Странно, не правда ли?
VD>Решарпер сейчас работает довольно не плохо. Особенно на фоне новой менеджед-реализации самого Шарпа. И функциональность там просто запредельная. VD>Навигация очень удобная. Жмешь Ctrl+T и пишешь большие буквы ( hs для поиска HashSet) нужного тебе символа (без оглядки на его тип). Далее из списка выбираешь и ты уже там. Далее очень удобный переход по реализациям интерфейсов и виртуальных методов. Ну, и много всего.
Пока работаю дома, я конечно могу себе позволить им пользоваться. Но у меня сомнения закрадываются что любая контора может позволить себе их прайс. Минимум 300 у.е. в год..кхм. Скоро MS в своем духе сопрет все их фичи и он перестанет быть нужен. Впрочем и visual assist уже не нужен, в последней студии не ставил его, ибо все из коробки.
Здравствуйте, licedey, Вы писали:
l> ·>В идеале тесты до основного кода пишутся... На основе чего эта тулза должна генерить тесты? Если ты можешь генерить тесты, то чего уж — генери сам основной код... и покрой тестами генератор. l> Ну я не фанат TDD, не понимаю как это делать. Читал, пытался писать сначала тесты, но привычка знаете, сначала формы шлепать, потом функционал потихоньку добавлять, а потом по требованию правой кнопочкой мыши и Generate Unit Test...
Надо начинать с разделения UI и функционала.
Попробуй писать логику до UI. Когда логика готова — прикручиваешь готовые оттестированные классы к форме.
Ну и ещё надо найти способ тестирования UI... с этом обычно самые проблемы. Не в курсе как это делается в C#, в веб-приложениях хорошо идёт Selenium.
Здравствуйте, ·, Вы писали:
·>Здравствуйте, licedey, Вы писали:
·>Надо начинать с разделения UI и функционала. ·>Попробуй писать логику до UI. Когда логика готова — прикручиваешь готовые оттестированные классы к форме. ·>Ну и ещё надо найти способ тестирования UI... с этом обычно самые проблемы. Не в курсе как это делается в C#, в веб-приложениях хорошо идёт Selenium.
У меня затык в том, что я не особо визуализирую классы-логики, до появления UI. То есть функционал полностью проясняется, когда перед тобой UI висит.
А второй значимый момент, это то, что клиент (а я фрилансер) всегда ведеться на красивый UI и дает дальше бюджет, и пусть внутри пустота.
Недавно история была, как 4ро парней из команды пыхтели над логикой (под Mac), а я в это время в одиночку красивенько отрисовывал UI (Win). Итог немного предсказуем.
Под Mac Проект заморозили, ибо прошло пол года а ничего не видно ((, а весь груз отвественности и бюджет отдали мне. 4-ых уделал одной красотой.
И в догонку может вы слышали золотое правило шаровары, Market first, Marketing second, Aestetic third and Functionality last. Это про приотеты в разработке своего продукта. Внешний вид получается уделывает фунционал.
Здравствуйте, licedey, Вы писали:
L>·>Надо начинать с разделения UI и функционала. L>·>Попробуй писать логику до UI. Когда логика готова — прикручиваешь готовые оттестированные классы к форме. L>·>Ну и ещё надо найти способ тестирования UI... с этом обычно самые проблемы. Не в курсе как это делается в C#, в веб-приложениях хорошо идёт Selenium. L>У меня затык в том, что я не особо визуализирую классы-логики, до появления UI. То есть функционал полностью проясняется, когда перед тобой UI висит. L>А второй значимый момент, это то, что клиент (а я фрилансер) всегда ведеться на красивый UI и дает дальше бюджет, и пусть внутри пустота.
Неужели весь этот код, по которому приходтися прыгать это "красивый UI"? Если так, то вряд ли тут тесты сильно помогут... Ведь свойство "быть красивым" в авто-тесте не проверишь...
А если таки что-то есть функиональное внутри, то его и можно покрывать тестами, независимо от UI.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
·>Здравствуйте, licedey, Вы писали:
L>>У меня затык в том, что я не особо визуализирую классы-логики, до появления UI. То есть функционал полностью проясняется, когда перед тобой UI висит. L>>А второй значимый момент, это то, что клиент (а я фрилансер) всегда ведеться на красивый UI и дает дальше бюджет, и пусть внутри пустота. ·>Неужели весь этот код, по которому приходтися прыгать это "красивый UI"? Если так, то вряд ли тут тесты сильно помогут... Ведь свойство "быть красивым" в авто-тесте не проверишь... ·>А если таки что-то есть функиональное внутри, то его и можно покрывать тестами, независимо от UI.
Ну я же не про один проект говорю, на фрилансе такое индусское хауноу попадается, что мучаешься в догадках где достать такую же траву, чтобы постичь глубину их мысли.
Вот там прыгаешь як скаженный.
Здравствуйте, licedey, Вы писали:
L>В общем, чтобы не растекаться мыслью по древу, перейду к вопросу. У вас есть монстр, у вас есть задача. Между ними — пропасть реализации. Как удержать в голове и реализовать все микрозадачи? L>Обычный процесс кодинга идет примерно так (по себе сужу). Вам надо создать класс (в нужной папке), создать в нем свойства, затем связать это с UI, потом поправить класс Settings, чтобы он учитывал внесенные изменения, в другом классе создать объект, перейти в нужный метод итд. В общем случае, мы постоянно прыгаем по коду. Огромному неуправляемому. И как проще сделать, чтобы эти прыжки были более продуктивными и не напрягали весь мозг.
L>Вот мой пример, что для этого делаю я. У меня есть мультизадача, или сверхзадача, которую обозначил заказчик (хотите менеджер). Разумеется я разбиваю ее на более мелкие подзадачи. И далее, исходя из них я начинаю кодить. Но тут и приходиться запинаться все время. Прыг в UI, прыг в конфиги, прыг в класс модели, прыг в класс view-модели, L>назад в UI. И этот процесс цикличен. Между этими прыжками, можно потерять какую-либо деталь и вообще улететь в космос, размышляя о бытие. L>Вобщем я пишу все в блокнот, все эти микрозадачи, и при каждом прыжке лезу в заметки, чтобы не забыть. У вас как?
Делайте задачу транзакционно -- не начинайте следующую пока не закончите текущую. Основные идеи, классы, абстракции не гнушайтесь записывать на бумагу. Это реально лучше чем записать в какой-нибудь блокнот на компьютере, больше осмысленности задействуется.
У меня ситуация схожа, хоть я и не фрилансер. Я активно использую R#, настроил его под себя -- свои hot-key'и и т.д. В случае с заказчиком и постоянными требованиями заведите какую-нибудь agile доску типа kanban, jira и т.д. Так легче ему и Вам отслеживать задачи и статус. Что не отменяет ручки и бумаги.
Здравствуйте, licedey, Вы писали: L>Из бенефитов я извлек только, что конструктор структуры генерится сам.
Для этого вообще одна строчка кода потребовалась, так как макрос генерации конструкторов уже есть из коробки.
Но ты не правильном мыслишь. Главный бенефит — это то что есть в конкретном макросе, а то, что ты волен создать любой макрос сам. Он, во время компиляции, сгенирирует тебе нужный тебе код по нужным тебе правилам. И когда надо ты подправишь макру и получишь нужные изменения в измененном коде.
Причем делается это все удобно и незаметно для пользователя. Пользователь просто получает готовые решения, которые сложно или невозможно сделать в виде библиотеки. Всяческие генераторы на Т4, посткомпиляторы (вроде Постшарпа) становятся ненужны.
Собственно, чтобы было понятно приведу вариант одного из простейших типов и то в какой код он раскрывается при компиляции:
Код структуры NSpan
[NitraMessage, StructuralEquality]
public struct NSpan : IComparable[NSpan]
{
public StartPos : int;
public EndPos : int;
public Length : int { get { EndPos - StartPos }}
public IsEmpty : bool
{
get { StartPos == EndPos }
}
public IntersectsWith(pos : int) : bool { pos <= EndPos && pos >= StartPos }
public IntersectsWith(start : int, end : int) : bool { start <= EndPos && end >= StartPos }
public IntersectsWith(other : NSpan) : bool { IntersectsWith(other.StartPos, other.EndPos) }
public IntersectsWith(other : Range) : bool { IntersectsWith(other.Span) }
public IntersectsWith(other : Location) : bool { IntersectsWith(other.Range) }
public override ToString() : string { StartPos + ", " + EndPos }
public CompareTo(other : NSpan) : int
{
def result = StartPos.CompareTo(other.StartPos);
if (result == 0)
EndPos.CompareTo(other.EndPos)
else
result
}
}
NitraMessage — как уже говорилось выше, генерирует код сериализации, дополнительное поле MsgId уникальное внутри модуля и коструктор (добавляет макру Record). StructuralEquality — это макра из стандартной библиотеки реализующая методы эквивалентности путем сравнения всех полей. В результате получаем вот такой код (получено декомпиляцией в C#):
Декомпилят структуры NSpan
public struct NSpan : IComparable<NSpan>, IEquatable<NSpan>, IStructuralEquatable
{
public readonly int StartPos;
public readonly int EndPos;
public int Length
{
get
{
return checked(this.EndPos - this.StartPos);
}
}
public bool IsEmpty
{
get
{
return this.StartPos == this.EndPos;
}
}
public short MsgId
{
get
{
return 109;
}
}
public int GetHashCode(IEqualityComparer _comparer)
{
return this.GetHashCode();
}
public bool Equals(object other, IEqualityComparer _comparer)
{
return this.Equals(other);
}
public static bool operator !=(NSpan first, NSpan second)
{
return !(first == second);
}
public static bool operator ==(NSpan first, NSpan second)
{
return first.Equals(second);
}
public override int GetHashCode()
{
int hash = 0;
hash += this.StartPos;
hash += hash << 10;
hash ^= hash >> 6;
hash += this.EndPos;
hash += hash << 10;
return hash ^ hash >> 6;
}
public override bool Equals(object other)
{
bool arg_2E_0;
if (!(other is NSpan))
{
arg_2E_0 = false;
}
else
{
NSpan x = (NSpan)other;
arg_2E_0 = this.EqualsImpl(x);
}
return arg_2E_0;
}
public bool Equals(NSpan other)
{
return this.EqualsImpl(other);
}
public bool IntersectsWith(int pos)
{
return pos <= this.EndPos && pos >= this.StartPos;
}
public bool IntersectsWith(int start, int end)
{
return start <= this.EndPos && end >= this.StartPos;
}
public bool IntersectsWith(NSpan other)
{
return this.IntersectsWith(other.StartPos, other.EndPos);
}
public bool IntersectsWith(Range other)
{
return this.IntersectsWith(other.Span);
}
public bool IntersectsWith(Location other)
{
return this.IntersectsWith(other.Range);
}
public override string ToString()
{
return this.StartPos.ToString() + ", " + this.EndPos.ToString();
}
public int CompareTo(NSpan other)
{
int result = this.StartPos.CompareTo(other.StartPos);
return (result != 0) ? result : this.EndPos.CompareTo(other.EndPos);
}
private bool EqualsImpl(NSpan other)
{
return this.EndPos == other.EndPos && this.StartPos == other.StartPos;
}
public void Serialize(BinaryWriter writer)
{
writer.Write(this.StartPos);
writer.Write(this.EndPos);
}
public static NSpan Deserialize(BinaryReader reader)
{
int num = reader.ReadInt32();
int arg_10_0 = num;
int endPos = reader.ReadInt32();
return new NSpan(arg_10_0, endPos);
}
[RecordCtor]
public NSpan([MappedMember("StartPos")] int startPos, [MappedMember("EndPos")] int endPos)
{
this.StartPos = startPos;
this.EndPos = endPos;
}
}
L>Спорить не буду, массовости не хватает, комьюнити.
А это заколдованный круг. Я много лет назад запарился с ним бороться и плюнул. Люди с удовольствием жрут рекламу, но думать своим мозгом, в большинстве своем, неспособны.
Когда лет 10 назад я пытался продвигать Немерл часть людей не понимала возможностей, часть спрашивал "а почему миллионы мух не пользуются им?", а часть откровенно противодействовала и испытывала батхерт. Я запарился убеждать и плюнул. С довольствием пользуюсь этим языком сам и помогаю другим.
Тем временем C# заимствовал часть фич которые у нас есть уже около 10 лет, но те кто усирался и орал "не нужно" теперь начинаю орать, что "это не из Немерле заимствовано!". А мне на них уже по хрен. Им нужны шашачки, а не ехать. L>Чтобы зашел на SO, а там уже 25 ответов на твой вопрос.
О чем речь? L>К слову, пришел несколько лет назад в Microsoft ua, и начал показывать им свой проект, который как я говорил в основе содержал ваш парсер. И они пожимали плечами при слове Немерле. Странно, не правда ли?
Ну, если бы ты пришел к Хельсбергу или тем кто компилятором занимался, то они бы тебе что-то сказали. А ты ведь пришел к каким-то менеджерам.
Потом в МС тщательно подтирали ссылки на Немерле даже в обсуждениях на гитхабе. В начале были ссылки, а потом их тщательно вымарали. У них там большой страх за то, что кто-то на них в суд подаст по патентам и авторским правам. А может просто не хотят рекламировать. Но факт есть факт. L>Пока работаю дома, я конечно могу себе позволить им пользоваться. Но у меня сомнения закрадываются что любая контора может позволить себе их прайс. Минимум 300 у.е. в год..кхм. Скоро MS в своем духе сопрет все их фичи и он перестанет быть нужен. Впрочем и visual assist уже не нужен, в последней студии не ставил его, ибо все из коробки.
MS вряд ли в скором времени даже к необходимому минимуму приблизится. Я тут начал писать код без Решарпера. Обвесился всевозможными плагинами, но все равно получается не то. Даже если есть фича, все равно качество не то. Тут разве что какой-нибудь Код-Раш будет конкурентом.
А Ассис... раньше там функциональности было мало. Не знаю как сейчас. Если все осталось на том же уровне, то действительно в студии теперь тоже не так плохо.
Что до денег — да, дорого. Но тот же MS закупает лицензии Решарпера тоннами, не скупится.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
— десяток/два строк на непосредственно рекурсивный "движок", плюс само собой код сериализации базисных типов.
Языком все делается, а на практике одни проблемы. Ну, и это всего лишь один из простых примеров, который можно легко понять. Макрос штука универсальная. И намного более мощная и удобная эти ваши ужимки на шаблонах.
Потом в наше время мало кто будет писать прикладные вещи на плюсах. У Яве, Шарпе и т.п. никаких выкрутасов на шаблонах нет, так как нет шаблонов.
VD>>Навигация очень удобная. Жмешь Ctrl+T и пишешь большие буквы ( hs для поиска HashSet) нужного тебе символа (без оглядки на его тип). Далее из списка выбираешь и ты уже там. Далее очень удобный переход по реализациям интерфейсов и виртуальных методов. Ну, и много всего.
EP>Такое и для C++ есть, даже не в рамках IDE: EP>https://www.youtube.com/watch?v=5FQwQ0QWBTU
Это из той же серии как сравнивать макры с шаблонным МП. Вроде как похожие вещи, а возможности несравнимы.
То что в этом видео показано для Шарпа есть из горобки в студии. Это примитивный набор. Он даже не обсуждается. Он только для плюсовиков диковиной является.
Фичи Решарпера по навигации намного круче. А уж рефакторинге и говорить не приходится.
Если бы ваших Емаксов людям хвтало, то такие вещи как CLion никто не затевал бы.
ЗЫ
Уж извини, но пенесометрия с плюсовиками мне совсем не интересно. Живите в своем древнем мирке спокойно. Вас никто не хотел беспокоить. Считайте, что у вас все круче чем у всех. Успехов вам! Денег нет!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
— десяток/два строк на непосредственно рекурсивный "движок", плюс само собой код сериализации базисных типов. VD>Языком все делается, а на практике одни проблемы.
Приведённый кусок кода из реального проекта паука который облазил P2P сеть в сотни тысяч узлов, протокол общения между узлами как раз на базе структур-сообщений, которые сериализуются этим самым кодом — пример аналогичный твоему. Но ты конечно можешь и дальше болтать про "одни проблемы".
VD>Ну, и это всего лишь один из простых примеров, который можно легко понять. Макрос штука универсальная. И намного более мощная и удобная эти ваши ужимки на шаблонах.
Штука крутая, несомненно. Мой поинт в том что твой пример вообще не раскрывает силы макросов в Nemerle, ибо подобная автоматическая сериализация много где реализуема, и поэтому никакого вау-эффекта не производит.
Пример с пользовательским условным оператором а-ля if, или например реализация интерполированных строк, были бы куда более показательны и эффектны.
VD>Потом в наше время мало кто будет писать прикладные вещи на плюсах. У Яве, Шарпе и т.п. никаких выкрутасов на шаблонах нет, так как нет шаблонов.
А получается так что именно прикладные вещи на C++ и пишутся, а всякие клей-прокладки между БД и UI на C#/Java — собственно скафолдинг и прочий LightSwitch тут не зря был упомянут, ибо подобные прокладки часто типовые.
VD>Это из той же серии как сравнивать макры с шаблонным МП. Вроде как похожие вещи, а возможности несравнимы. VD>То что в этом видео показано для Шарпа есть из горобки в студии. Это примитивный набор. Он даже не обсуждается. Он только для плюсовиков диковиной является. VD>Фичи Решарпера по навигации намного круче. А уж рефакторинге и говорить не приходится. VD>Если бы ваших Емаксов людям хвтало, то такие вещи как CLion никто не затевал бы. VD>ЗЫ VD>Уж извини, но пенесометрия с плюсовиками мне совсем не интересно. Живите в своем древнем мирке спокойно. Вас никто не хотел беспокоить. Считайте, что у вас все круче чем у всех. Успехов вам! Денег нет!
Так ты не понял о чём речь, и как обычно продемонстрировал чудеса адекватности. Речь о том что фичи о которых ты сказал есть ДАЖЕ в НЕ-IDE для обхаиваемого тобой C++. Скорей всего у Решарпера действительно есть какие-то крутые фичи для навигации, но ты почему-то вместо них упомянул какой-то примитив.
Здравствуйте, VladD2, Вы писали:
VD>Потом в МС тщательно подтирали ссылки на Немерле даже в обсуждениях на гитхабе. В начале были ссылки, а потом их тщательно вымарали. У них там большой страх за то, что кто-то на них в суд подаст по патентам и авторским правам. А может просто не хотят рекламировать. Но факт есть факт.