Задать вопрос
  • Как можно подменить вызов функции в классе?

    Nipheris
    @Nipheris Куратор тега C++
    Вызывать обе с помощью указателя на метод. Вы в вопросе уже ответ написали.
    Ответ написан
  • Использование Binding в WPF?

    Nipheris
    @Nipheris Куратор тега C#
    > При этом реализовать это без использования INotifyPropertyChanged.
    Вы хотя бы коротко причину указали, почему так нельзя делать. Почему меня интересует причина? Потому что если вы скажете "я не хочу забивать чистенькие модельные классы, которые используются в нескольких проектах всякими непонятными INotifyPropertyChanged" я вам отвечу "а и не нужно их трогать, для реализации INotifyPropertyChanged создаются ViewModel-объекты, которые и привязываются к контролам вместо модельных. Они и реализуют INPC, кроме того могут выставлять во вьюху некоторые свойства, которых нет в модельных объектах".
    А если вы скажете "я тут экспериментирую", то тогда можете запилить DependencyProperty у себя в привязываемом объекте, хотя это довольно странно. Но работать должно.
    Ответ написан
    Комментировать
  • Как делаются скриптовые языки программирования?

    Короткий ответ: читаем книгу дракона. Есть и более навороченная литература, но начинают все с этой книги (нам по ней читали в универе курс трансляции языков).

    Длинный ответ: ваш транслятор принимает на вход последовательность символов (допустим, UTF-8 текст), "понимает" ее в соответствии со спецификацией вашего языка, и выплевывает в качестве вывода инструкции на другом языке (в виде текстового файла или файла спец. формата). Этим "друим языком" может быть язык ассемблера какой-то железной платформы (x86_64, ARM, SPARC), и результирующим файлом будет бинарник под указанную архитектуру (точнее - объектный модуль, бинарник потом будет собран линковщиком) - так компилятся, например, C/C++. "Другим языком" может быть язык виртуальной машины (LLVM/байткод Java/MSIL) - так компилятся С/C++ (если через LLVM), Java, Scala, C#, F#, VB. "Другим языком" может быть и более высокоуровневый язык - часто, чтобы не париться на начальных этапах развития языка генерацией машинного кода, делают транслятор, который генерит код на Си, и этот код на Си уже компилят известным компилятором в бинарник. Или к примеру, CoffeeScript/TypeScript транслируются в JavaScript, т.к. веб-браузеры кроме джаваскрипта исполнять пока ничего не умеют.

    Конечно же, вы можете написать интерпретатор, а не компилятор - тогда ваша программа будет сразу же исполнять инструкции на вашем языке, не генерируя какой-либо выходной файл. Так поступают довольно много систем, например Node.js. Python делает также, если отключить генерацию pyc-файлов (поправьте меня, если я ошибаюсь).

    На каком языке реализовать сам транслятор - не имеет особого значения. Более того, хорошим тоном считается реализовать на разрабатываемом языке компилятор этого же языка - это называется self-hosting. Обычно наличие компилятора языка на этом же языке считается первым этапом серьезного отношения к языку. Разумеется, первую версию компилятора нужно будет реализовать на уже существующем языке (или сделать bootstrapping, если уж вы совсем суровый разработчик).

    Т.к. в задачах разбора входного потока (parsing) уже набито очень много шишек, и люди посвятили свои жизни и научные карьеры изучению этого вопроса, то сделано и немало инструментов для помощи в разработке компилятора. Как правило, такие инструменты дают возможность описать грамматику вашего языка на некоем специализированном синтаксисе (вроде BNF), а потом по этому описанию генерят вам код лексера и парсера на удобном для вас языке (это модули, которые выполнят первичный разбор входного потока на вашем языке на токены, и построят абстрактное синтаксическое дерево (AST)). А вы уже дописываете к ним основную часть вашего компилятора. Как пример, при написании компиляторов на языке Си часто используют flex в связке с yacc/bison. Есть более комлексные пакеты, позволяющие генерить код парсеров на различных языках - ANTLR, GOLD. А можно и самому написать лексер и парсер, особенно если вы уже сделали первую версию компилятора и переписываете его на вашем же языке).
    Ответ написан
    Комментировать
  • Есть ли бесплатное решение для экспорта из MS Excel в HTML таблицы на C#?

    Nipheris
    @Nipheris Куратор тега C#
    Какие-то сложные советы вам дали тут). Если вам не нужно особо навороченное форматирование, берите EPPlus и читайте Экселевский файл. Все что прочли - сами отрендерите в html. А в идеале лучше сделать два выходных конвертера для отчета - один, который сохраняет в Excel, а другой - в HTML, чтобы не играть в испорченный телефон.
    Не надо ничего декомпилировать и затирать, если библиотека платная, на то есть причины, пока все будут так делать, никто не будет относиться к бизнесу из России как к адекватному.
    Ответ написан
    Комментировать
  • Как скомпилировать проект Visual Studio 2015 под VЫ2010?

    Nipheris
    @Nipheris Куратор тега C#
    1) убедиться, что все зависимости имеют версии для .net 4.0 или ниже
    2) переделать те места в коде, которые используют фичи C# > 4.0
    3) сменить версию целевого .net framework на 4.0 в свойствах проекта
    Ответ написан
    2 комментария
  • Зачем нужны делегаты в C#?

    Nipheris
    @Nipheris Куратор тега C#
    Дмитрий Ковальский прав, с предыдущего вопроса не прошло и недели.

    Если того что там есть вам мало, зайдем с практической стороны. Вы пишете для меня библиотеку и я прошу вас сделать мне функцию обхода графа по ПВШ/ПВГ, которая будет вызывать для каждой вершины некоторое действие (заранее неизвестное). Я хочу чтобы сделали именно обход, а что делать с каждой вершиной я хочу решать сам во время использования. В идеале, хотелось бы передавать вам это "действие" для каждой вершины как параметр в функцию обхода. Как вы решите эту задачу?
    Ответ написан
  • Какие существуют алгоритмы для раскрытия скобок в выражении?

    Nipheris
    @Nipheris Куратор тега C#
    Да распарсите это дело в AST и освобождайте от чего хотите. Можно, например, расчитать константные выражения (заменить (3 + 4) на 7). Скобки убрать еще проще - если у узла один потомок (выражение в скобках) - заменить текущий узел на потомка.
    Ответ написан
    Комментировать
  • Как организовать структуру базы данных для динамических характеристик?

    Как добавить товар в корзину?

    - EAV (ссылку дал @muhammad_97);
    - JSON/XML в реляционной базе;
    - JSON в документной базе (CouchDB/MongoDB) (предпочтительный вариант);
    Ответ написан
  • Какое ПО использовать для написания книг?

    Кстати, если научная книга и много формул/математики - то Latex+Git. Как говорится, тяжело в учении, легко в бою. Больше конечно подходит для статей, но потенциал у связки очень большой.
    Ответ написан
    Комментировать
  • Как добавить ссылку на библиотеку классов в проект, чтобы все ссылки из этой библиотеки автоматически добавились?

    Nipheris
    @Nipheris Куратор тега C#
    Вам не нужно добавлять ссылки на все транзитивные зависимости, что у вас есть.
    Ссылаться нужно только на те сборки, что вы непосредственно используете в коде ссылающейся сборки.
    На самом деле у вас проблема с процессом билда проекта. Решить ее можно разными способами, лучший вариант - плотно работать с NuGet и брать все зависимости оттуда. Т.к. с зависимостями у NuGet все в порядке, то очень удобно и свои библиотеки собирать как NuGet-пакеты, тогда указанных вами проблем просто не будет в принципе.
    Вообще, вон скоро DNX допилят, ее система проектов как раз была передалана для использования пакета как основной сущности для сборки и деплоя. Эту систему проектов вполне можно применять и для не-веб проектов, осталось только дождаться релиза.
    Ответ написан
    Комментировать
  • Почему методы нельзя передавать в функции без делегатов?

    Nipheris
    @Nipheris Куратор тега C#
    Делегаты - это форма существования функтора на платформе .NET. Почитайте про функтор, и поймете (наверное), зачем нужен делегат.

    Если коротко и грубо - вызвать напрямую можно всегда только конкретный метод, который будет четко известен еще на стадии компиляции. Если же вы пишете некий обобщенный алгоритм и заранее не знаете, какие КОНКРЕТНО методы у каких КОНКРЕТНО объектов будете вызывать - вам необходимо будет воспользоваться делегатом.
    Простейший пример - LINQ-методы. Метод фильтрации Where получает своим параметром функтор, который возвращает true или false, что значит - оставить элемент в коллекции или выкинуть его. В этом методе в цикле foreach вызывается переданный делегат для каждого элемента. Where понятия не имеет, какой конкретно метод (или лямбда-выражение) вы захотите подставить в качестве фильтрующего предиката.

    Другой пример - события. События в дотнете - это делегаты с урезанным публичным интерфейсом. Так как, к примеру, кнопка не знает о том, кто захочет подписаться на событие ее нажатия, она никак не может вызвать конкретные методы у конкретных объектов. Чтобы иметь возможность сообщать о своем нажатии, кнопка выставляет событие Click наружу, давая возможность записать туда конкретные методы для вызова.

    Кстати, делегат выполняет еще и функцию связывания: для нестатических методов делегат хранит еще и объект, для которого будет вызван instance-метод (т.е. связывает пару объект-метод).

    Таким образом,
    > Почему методы нельзя передавать в функции без делегатов?
    Делегаты - это и есть передача методов в функции.
    Ответ написан
    Комментировать
  • Как правильно спроектировать базу; консистентность данных?

    > и для каждого из них есть уникальные поля
    А как этими полями будут пользоваться? Группировки/фильтры/агрегация по ним будут?
    Если будут, то тогда действительно 20 таблиц (и это нормально, т.к. тогда и кода для каждого типа пользователя у вас будет достаточно). И паттерны наследования - concrete table, single table, class table.
    Если не будут (т.е. эти поля будут читаться/писаться целиком) - может в JSON поле их?
    Ответ написан
    Комментировать
  • Какие файлы можно удалить из папки Debug?

    Nipheris
    @Nipheris Куратор тега C#
    Во-первых для дальнейшего использования программы вам нужно скомпилировать ее в конфигурации Release. Какие дефолтовые настройки стоят для каждой из конфигураций можно посмотреть в файле проекта.

    *.pdb это не странные файлы, а отладочная информация, если я не ошибаюсь, в Release конфигурации они по-дефолту не создаются. Если все таки они есть - можете спокойно их удалять.
    .vshost.exe.* - это файлы помощника студийного дебаггера. Для самостоятельной работы программы они также не нужны.
    .exe.config - потребность в этом файле зависит от того, что в нем написано. Если не понимаете, что там - лучше оставить его и поставлять с программой (там, например, могут быть редиректы версий сборок).
    *.xml - если это не ваши xml-ки, то обычно это автосгенеренная документация. Если у вас приложение, а не библиотека, можете убрать их из поставки.

    Насчет остального должны знать сами. А вообще, изучайте инструмент, которым пользуетесь, если уже дошли до этапа поставки приложения (если конечно у вас не лабораторка там :) )
    Ответ написан
    Комментировать
  • Как послать http запрос через OpenVpn c#?

    Nipheris
    @Nipheris Куратор тега C#
    Армянское Радио абсолютно прав, если у вас маршруты настроены как надо, то нужный траф и так пойдет по vpn, а если не как надо - то их надо настроить. Это обычно делается независимо от приложений, которые будут общаться по сети, это делает администратор либо в конфиге openvpn, чтобы последний отдавал нужные роуты клиенту при подключении, либо вручную в каком-нибудь батнике, который юзер запускает после подключения.

    Отдельный вопрос, если вы хотите управлять маршрутами из вашей программы. Это возможно, но я сильно не уверен, что вам это нужно. Обычно такое нужно если у вас много различных конфигураций vpn и вам нужно по какому-нибудь хитрому алгоритму без участия юзера выбирать, по какому vpn-каналу отправлять трафик.
    Ответ написан
    2 комментария
  • В чем плюсы и минусы классов и библиотек?

    Nipheris
    @Nipheris Куратор тега C++
    Классы, как и процедуры/функции - это простейшие кирпичи для построения дома. Библиотеки - это когда вам подгоняют готовую кухню/ванную или водопровод, который вы встраиваете в ваш дом.

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

    В целом я понял вопрос как "зачем нужны гайки и болтики, если я могу сделать мотор или купить его у мотозавода?". А вы/мотозавод, собственно, из чего будете мотор собирать?
    Ответ написан
    Комментировать
  • Что представляет собой ссылка?

    Nipheris
    @Nipheris Куратор тега C++
    Ну конечно что ждет от вас препод, нам тут все равно не угадать. Я бы как раз и ответил, что это имя для переменной. Я не соглашусь с некоторыми ответами здесь, т.к. не всегда для ссылки компилятор будет выделять память - локальная ссылка на локальную же переменную как раз таки будет просто вторым именем в таблице идентификаторов компилятора при компиляции программы.

    Главная фишка ссылки в том, что это абстрактное l-value, т.е. сущность, в которую можно что-то присвоить (если базовый тип - не константный). То есть ссылка всегда оборачивает какой-либо адрес в памяти, причем на время жизни ссылки этот адрес постоянен (ссылку нельзя "переставить" на другую область памяти). Именно поэтому ссылки всегда нужно инициализировать.
    ЧЕМ инициализировать - другое дело. Можно переменной, а можно - разыменованным указателем.

    В зависимости от ситуации технически ссылка может быть реализована по-разному. Если это ссылка на лок. переменную, то большинство компиляторов просто добавят себе новое имя в таблицу. Никакой дополнительной памяти выделяться не будет. Если же ссылка приходит как параметр или отдается как возвращаемое значение - то тут скорее всего понадобится реализовать ее как указатель (указатель передавать/возвращать). Однако, еще раз напомню: ссылка скрывает технические подробности, вы с ней работаете как с обычной переменной. Более того, она скрывает настолько, что даже может продлевать жизнь временным объектам.

    Теперь попробуем сранить ссылку и другие сущности в языке.
    Определение ссылки vs определение обычной переменной:
    определение обычной переменной это всегда выделение памяти и добавление нового имени в таблицу компилятора для этой области памяти. Определение ссылки - это прежде всего ОПРЕДЕЛЕНИЕ ИМЕНИ, а уже в тех случаях, когда привязку этого ИМЕНИ к АДРЕСУ невозможно осуществить во время компиляции (т.е. например в случае передачи ссылки как параметра функции), то для реализации ссылки применятся указатель. Важно, что компилятор сам выбирает способ реализации поведения ссылки. В любом случае, назначение ссылки - обернуть в l-value уже ВЫДЕЛЕННУЮ память (совершенно не важно, на стеке, куче или где-то еще). Новой памяти для хранения значения целевого типа НЕ выделяется. Если у вас есть переменная и ссылка/несколько ссылок на нее, то при присвоении значения через любую из сущностей вы будете менять одну и ту же область памяти.

    Ссылка vs указатель:
    - самое важное отличие - указатель САМ ПО СЕБЕ является переменной. Под указатель int* компилятор выделит память также, как и под int. Указатель существует сам по себе, ему (если он не const) можно присваивать новые значение, можно присвоить nullptr. Можно даже хранить в нем совершенно некорректный адрес и все будет ок до тех пор, пока вы не разыменуете его. Только когда вы разыменовываете указатель, вы превращаете его в l-value, и с этого момента между ним и ссылкой разницы нет.
    - второе отличие - собственно необходимость разыменования. Т.к. указатель - самостоятельная переменная, для обращения по адресу, на который указатель смотрит, нужно сделать ему *p. Именно в этот момент компилятор начинает рассматривать значение указателя как адрес в памяти, с которым вы собираетесь что-то сделать (если быть совсем точным, но не в момент разыменования, а при попытке чтения/записи. В принципе вы можете даже инициализировать ссылку некорректным указателем, и программа не упадет, пока вы не попытаетесь читать/присваивать по этой ссылке).
    - с учетом сказанного, ссылку можно грубо считать "константым указателем с автоматическим разыменованием". Грубо, т.к. согласно стандарту есть нюансы, такие как вышеупомянутое продлевание жизни временным объектам.
    Ответ написан
    Комментировать
  • Как вернуть файлы?

    Чет так и не понял в чем проблема.. Если папка скрытая - то включи отображение скрытых папок, если к папке нет доступа, то открой командную строку в этой папке, и
    cacls *.* /T /G ALL:F
    Ответ написан
    3 комментария
  • Как расшифровать https?

    Можно, либо получаете доступ к инфраструктуре сервиса и ковыряете трафик еще до отправки клиенту, либо ставите на клиента поддельный корневой сертификат, и можете пускать трафик через себя. Посмотрите как делает Fiddler на локальной машине, чтобы перехватывать HTTPS трафик. Если вы сможете установить липовый сертификат, то сможете и перешифровывать на middle-стороне трафик, создавая иллюзию нормального HTTPS соединения.
    Ответ написан
    Комментировать
  • Плохо ли если класс самодостаточен, в плане получения каких то данных необходимых для его полноценной работы?

    Nipheris
    @Nipheris Куратор тега C#
    Зависит от того, какую ответственность вы "отдаете" в класс. Если это так называемый "value object", т.е. некий неизменяемый композит, то лучше ему в конструктор передать сразу готовые значения. Если же это самостоятельный объект с внятным жизненным циклом и определенной ответственностью - тогда конечно логично чтобы он сам брал данные из репозитория.
    Вам нужно почитать про Dependency Injection - это как раз та "середина" между двумя альтернативами, что вы предложили в виде фрагментов кода. Обращаться к глобальном объекту репозитория - это также антипаттерн. Гораздо лучший вариант - это когда объекту при создании передается (!) репозиторий в конструкторе, а объект уже САМ делает выборки необходимых данных. Это как раз и есть удачный вариант спуска от общего к частному. Плюс, вся логика сосредоточена в классе - я всегда могу добавить новую Модель (если следовать вашим примерам), которая также берет репозиторий, но вытаскивает из него уже ДРУГИЕ сведения.
    Вот стандартный туториал, в котором роль вашего "класса" выполняет ASP.NET-контроллер, и он получает репозиторий в конструкторе: www.asp.net/web-api/overview/advanced/dependency-i...

    Вообще принцип всегда такой - если есть некоторая переменная или значение, то есть N точек, из которых можно получить к ней доступ. Чем меньше этих точек - и при этом вы можете без извращений реализовать нужную вам бизнес-логику - тем лучше. И чем ближе в коде эти точки расположены друг к другу - тем лучше. Всегда удобнее работать с кодом, когда данные конкретной сущности и логика их обработки умещаются хотя бы в одном файле.
    Ответ написан
    3 комментария