Я правильно понимаю что $250K - это всё-таки доход от агенстства за эти полтора года, а не чистая прибыль ваша как владельца? Просто иногда думаю о создании агентства, но понимаю, что выигрыша по деньгам особого не будет, а вместо любимого кода придётся заниматься нелюбимым менеджментом.
А что такое в этом коде defaultStringObjects если не секрет? Если это не дай бог List, то никаких гарантий, что между проверкой .Count на 0 и его использования в качестве делителя список не очистится. Ну то есть, как и в примере из статьи, фрагмент кода вызвает много вопросов не только у анализатора, но и у обычного программиста :) А вот если это массив или какой-нибудь IReadonlyList, то да — нужно писать ребятам в PVS. Я о таких вещах обычно сообщаю и рано или поздно они фиксятся.
Я всё собираюсь написать статью, которая расскажет про трудный путь к текущему решению через асинхронные UDF (которые оказались "иногда синхронными", причём в внезапно) к связке RTD + SignalR. Про некоторые неприятные сюрпризы от ExcelDNA и почему иногда мне хочется написать свою версию этой библиотеки (конечно с преферансом и институтками), а не использовать то, что есть. Ну а про то, что COM Interop в .NET вообще и в Excel в частности — это бесконечный источник боли, наверное, только ленивый не писал ещё :)
У меня, как у человека, который в этом "велосипеде" делал почти всё от колёс до руля есть ответы на ваши вопросы (надеюсь):
А как правильно делать интерфейсы в Excel так, чтобы можно было показать пользователю конкретную страницу PDF файла из которого изначально был получен показатель, содержащийся в текущей ячейке? Неужели на связке VBA/MS Forms что-то писать в 2020 году? Может TaskPane со встроенным браузером? Или внешний процесс для отображения PDF файлов… Ну так у нас он есть — браузер называется. Если есть идеи как это сделать лучше/правильней — я с удовольствием выслушаю.
Это решение никаким образом визуализацию не облегчит, потому что оно не для этого предназначенно. Наверное, тут проблема в том, что изначальная задача не очень понятно описана. Она не в том, чтобы получить табличные данные из базы и отобразить их в виде отчёта, она о том, чтобы из данные из разных неструктурированных внешних источников (отсканированные PDF отчёты) подготовить к загрузке в базу и дальнейшему анализу другими средствами.
Так что я двумя руками за существующие решения, но иногда приходится и велосипеды собирать из подручных материалов :)
Ну, наверное 7 лет назад это и правда могло быть удивительным для тех, кто не особо подробно читает документацию, но для 2020 года статья не особо актуальна как мне кажется.
Для тех кто собирается другие примеры приводить — «обычно атеист» != «все поголовно атеисты». То есть я понимаю, что кто-то вынужден такой налог платить, кто-то платит его из идейных соображений, кто-то просто не понимает, что он там платит. Но большая часть русскояызчных трудовых (подчёркиваю) мигрантов, работающих в IT и около него всё-таки чаще всего атеисты и налога этого не платят.
Cерьёзно? Ну, значит, я отстал от прогресса… Книгу правда перевели больше десяти лет назад, но как-то она мимо меня прошла или, возможно, я её в оригинале читал. Пусть будут «родные», мне не жалко.
«Родные» классы и ресурсы — это что-то особенного!
<sarcasm>
Там ещё Google Translator предлагает «природные», «отечественные» и «туземные» жаль, что вы их не выбрали для перевода слова «native».
</sarcasm>
Всё-таки тут англицизм «нативные» более уместен и привычен, а потому меньше режет глаз.
Автор не может написать вам пример кода. Он же ясно сказал, что его «синтаксис, основанный на текстовых грамматиках» органичивает. Он вам может нарисовать пример кода. Наверное…
А вы как будете расширять семантику своего нового языка? Или вы настолько уверенны в его полноте, что подобные вещи вам в голову не приходят?
По поводу добавления ключевых слов в язык — вот тут у Эрика Липперта очень толково изложено зачем ключевое слово async вообще притащили в язык. То есть, можно было без него, но это потенциально ломало работающий код и поэтому было принято такое решение. Оно не идеальное, но оно взвешенное и осознанное. А предложение не задавать типы в контракте — ну это тоже не новость. Языки с динамической типизацией тоже имеют свою нишу.
Ещё раз прочитайте что конкретно из написаного у автора вызвало моё возмущение:
Причина добавления модификаторов методов async/wait в C# — видимо стало понятно, что жёсткая (синхронная) связь вызова метода и возвращаемого значения не соответствует практическим задачам.
Где тут про совместимость типов T и Task<T> говорится? Кто-то мешает вам вернуть Task<T> из метода, который не имеет модификатора async? Этот модификатор вообще только компилятору нужен. Вот тут Эрик Липперт очень толково рассказывает зачем это ключевое слово добавили в язык (если коротко — для того, чтобы добавление ключевого слова await не сломало старый код, то есть для обратной совместимости).
Там уже выше ответили, что этот модификатор не имеет никакого отношения к контракту, а описывает особенности реализации. То есть к типизации точно не относится.
Причина добавления модификаторов методов async/wait в C# — видимо стало понятно, что жёсткая (синхронная) связь вызова метода и возвращаемого значения не соответствует практическим задачам.
Что? И это пишет человек, у которого в профиле значится «Разработчик .NET»! Модификатор async никак не влияет на тип возвращаемого методом значения, то есть к типизации не имеет вообще никакого отношения. А что касается языков моделирования (потому что большая часть тут описанного это как раз о моделировании, а не о реализации) — чем вам UML то не угодил? Не идеал, конечно, но свою задачу более-менее выполняет.
Что было, то и будет; и что делалось, то и будет делаться, и нет ничего нового под солнцем. Бывает нечто, о чем говорят: «смотри, вот это новое», но это было уже в веках, бывших прежде нас..
Я правильно понимаю что $250K - это всё-таки доход от агенстства за эти полтора года, а не чистая прибыль ваша как владельца? Просто иногда думаю о создании агентства, но понимаю, что выигрыша по деньгам особого не будет, а вместо любимого кода придётся заниматься нелюбимым менеджментом.
А что такое в этом коде defaultStringObjects если не секрет? Если это не дай бог List, то никаких гарантий, что между проверкой .Count на 0 и его использования в качестве делителя список не очистится. Ну то есть, как и в примере из статьи, фрагмент кода вызвает много вопросов не только у анализатора, но и у обычного программиста :) А вот если это массив или какой-нибудь IReadonlyList, то да — нужно писать ребятам в PVS. Я о таких вещах обычно сообщаю и рано или поздно они фиксятся.
Я всё собираюсь написать статью, которая расскажет про трудный путь к текущему решению через асинхронные UDF (которые оказались "иногда синхронными", причём в внезапно) к связке RTD + SignalR. Про некоторые неприятные сюрпризы от ExcelDNA и почему иногда мне хочется написать свою версию этой библиотеки (конечно с преферансом и институтками), а не использовать то, что есть. Ну а про то, что COM Interop в .NET вообще и в Excel в частности — это бесконечный источник боли, наверное, только ленивый не писал ещё :)
У меня, как у человека, который в этом "велосипеде" делал почти всё от колёс до руля есть ответы на ваши вопросы (надеюсь):
Так что я двумя руками за существующие решения, но иногда приходится и велосипеды собирать из подручных материалов :)
<sarcasm>
Там ещё Google Translator предлагает «природные», «отечественные» и «туземные» жаль, что вы их не выбрали для перевода слова «native».
</sarcasm>
Всё-таки тут англицизм «нативные» более уместен и привычен, а потому меньше режет глаз.
По поводу добавления ключевых слов в язык — вот тут у Эрика Липперта очень толково изложено зачем ключевое слово
async
вообще притащили в язык. То есть, можно было без него, но это потенциально ломало работающий код и поэтому было принято такое решение. Оно не идеальное, но оно взвешенное и осознанное. А предложение не задавать типы в контракте — ну это тоже не новость. Языки с динамической типизацией тоже имеют свою нишу.Где тут про совместимость типов
T
иTask<T>
говорится? Кто-то мешает вам вернутьTask<T>
из метода, который не имеет модификатораasync
? Этот модификатор вообще только компилятору нужен. Вот тут Эрик Липперт очень толково рассказывает зачем это ключевое слово добавили в язык (если коротко — для того, чтобы добавление ключевого словаawait
не сломало старый код, то есть для обратной совместимости).Там уже выше ответили, что этот модификатор не имеет никакого отношения к контракту, а описывает особенности реализации. То есть к типизации точно не относится.
Что? И это пишет человек, у которого в профиле значится «Разработчик .NET»! Модификатор async никак не влияет на тип возвращаемого методом значения, то есть к типизации не имеет вообще никакого отношения. А что касается языков моделирования (потому что большая часть тут описанного это как раз о моделировании, а не о реализации) — чем вам UML то не угодил? Не идеал, конечно, но свою задачу более-менее выполняет.
Виктор Пелевин «Оружие возмездия»