Задать вопрос
  • Как легче освоить внедрение зависимостей, code-first, TDD и паттерны?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый вечер! Спасибо за приглашение.
    На мой взгляд, Вам следует придерживаться следующих приоритетов по изучению:
    1. внедрение зависимостей более важно из Вашего списка, т.к. относится к SOLID принципам;
    2. TDD - на мой взгляд, вещь более нужная для изучения, чем code-first или patterns. Сам не так давно начал разрабатывать по TDD. Это очень здорово, что изобрели такой подход. Экономит тонну времени на ручное тестирование, а также дает быстрое понимание, что и где случайно (или неслучайно) сломалось. Главное - понимать, что покрывать тестами;
    3. третьим в список я бы добавил AngularJS или KnockoutJS или BackboneJS - сам пока что не изучил их и не начал применять, но судя по их популярности и преимуществам - думаю, Вам стоит с ними ознакомиться;
    4. code-first или database-first - не так уж и важно на Вашем этапе понимания. Главное отличие подхода Code-first: 1) модель пишется вручную, в связи с чем не нужно постоянно отслеживать edmx-диаграмму (т.е. можно считать, что Ваша code-first модель всегда находится в актуальном состоянии); 2) поддерживает миграции БД. В Database-first Вам нужно самому отслеживать актуальность состояния Вашей edmx-модели - с этим тоже могут быть проблемы. Опять же - только с опытом. С другой стороны, Database-first позволяет наглядно видеть Вашу модель, а вот Code-first - нет;
    5. паттернами тоже можете пока что голову не забивать. Безусловно, это нужно, но понимание их придет только с опытом (признаюсь честно: я сам не до конца все паттерны знаю и понимаю). На мой взгляд, важно соблюдать 1 основной паттерн - 3-уровневая архитектура (клиентский слой, слой бизнес-логики, слой работы с данными).

    Теперь по MVC.
    1. Model - тут, в принципе, всё просто: модель данных. Здесь можно поспорить, что иметь в виду под Моделью: модель самих данных или модель представления. Лично я после опыта работы с шаблоном MVVM в WPF под моделью данных в терминах ASP.NET MVC понимаю модель представления, а под термином "модель данных" - саму доменную модель (EF code-first, например). Кто-то может сказать, что это "лишняя работа" - по упаковыванию модели данных из EF-объектов в объекты модели представления. Да, частично соглашусь. Но зато это дает некую гарантию безопасности, что случайно пользователь не поменяет важную часть модели данных (например, ID).
    2. Контроллер. Основная задача контроллера - сформировать данные для отображения и передать эти данные в представление. Т.е. нужно стремиться к тому, чтобы код метода действия в контроллере содержал минимум кода. В идеале - вызов метода из слоя бизнес-логики и передача полученных данных в представление. Если Вы видите, что метод действия в контроллере содержит какую-то бизнес-логику, то это сигнал к рефакторингу: Ваш метод действия слишком много знает. По опыту могу добавить, что в среднем код метода действия содержит от 2 до 20-30 строк кода (с учетом того, что скобки { и } расположены на отдельных строках).
    3. Представление. Тут тоже всё просто: отобразить данные (из модели представления). Ни в коем случае нельзя в представлении писать логику по работе с самими данными, например, так делать нельзя:
    <div id="account">
        @{
            using(var db = new MyEfDbContext()
            {
                var userAccount = db.Accounts.FirstOrDefault(e => e.Username == User.Identity.Username);
                if(userAccount != null)
                {
                    @:Имя: @userAccount.Name
                    @:Фамилия: @userAccount.LastName
                }
            }
        }
    </div>


    Если у Вас 3-уровневая архитектура, например, есть слои:
    1. MyApp.MVC - MVC-application
    2. MyApp.BL - слой бизнес-логики
    3. MyApp.DAL - слой работы с данными
    то в представлении (View) вызывать напрямую сервисы бизнес-логики тоже нельзя, особенно, если Вы используете DI-принцип (внедрение зависимостей) и IoC контейнер. Т.е. такой пример недопустим:
    <div id="account">
        @{
            var accountService = new MyApp.BL.AccountService();
            var userAccount = accountService.GetUserAccountByUsername(User.Identity.Name);
            if(userAccount != null)
            {
                @:Имя: @userAccount.Name
                @:Фамилия: @userAccount.LastName
            }
        }
    </div>

    Попробую донести мысль архитектора и разработчика Александра Шевчука (преподавателя с http://itvdn.com): "Одна из главных целей при разработке - стремиться к упрощению системы". Ослабление зависимостей позволяет нам упрощать систему благодаря тому, что изменение осуществляется только на 1 каком-то слое/уровне. Если Вы во View вынесете логику по работе с данными, а уж тем более, как в примерах выше, работу с EF-контекстом, то Вы усилите зависимость одного компонента системы (MVC-слоя) от другого (слоя работы с данными или слоя бизнес-логики). Усиление зависимостей приводит к бОльшему числу изменений, что в свою очередь сказывается на повышении расходов на эту систему. Ослабление зависимостей приводит к меньшему числу изменений (например, при переходе от EF к native SQL или NHibernate затрагивается только слой работы с данными, а слой MVC и бизнес-логики не меняются), а значит, к более раннему выпуску системы или очередного релиза, и как следствие, снижение расходов (не только денежных, но и других ресурсов) на разработку. TDD тоже можно отнести к практикам, которые снижают затраты ресурсов на содержание системы. Но это я ушел в глобальное...

    Правильным будет подход, при котором у Вас снижается зависимость компонентов системы друг от друга, в случае с ASP.NET MVC приложением, на мой взгляд, это когда:
    - View знает о модели (я по прежнему буду иметь в виду модель представления - ViewModel, которые объявлены либо в MVC-слое, либо в слое бизнес-логики);
    - контроллер знает о слое бизнес-логики, обращается к нему за выполнением операций и получением ViewModel'ей, после чего передает во View полученную ViewModel (ну или JSON-данные);
    - Model формируется по принципу, грубо говоря, почти на каждую View своя модель.

    Фразу "правильным будет подход" я обосновываю тем, что у такого подхода есть масса плюсов (которые очевидны опытным разработчикам, но могут быть не до конца или неправильно поняты менее опытными коллегами, а именно):
    + View ничего не знает о доменной модели (только о ViewModel), благодаря чему Вы можете спокойно менять свою доменную модель, не внося изменений во View (см. выше про ослабление зависимостей и снижение количества связей). Также Вы спокойно можете перейти от EF к NHibernate или к native SQL, или использовать и то, и другое - View об этом никогда не узнает;
    + контроллер (да и весь MVC-слой) знает только о существовании слоя бизнес-логики, но ничего не знает о слое работы с данными.
    + если на View делать отдельную ViewModel, то это позволяет более полноценно управлять тем, что нужно показать пользователю. Т.е. дает возможность большего контроля отображаемых данных, повышает безопасность Вашего приложения (пользователь, например, не сможет изменить ID просматриваемой записи, если этого ID нет вообще в модели представления).

    Ну а вообще все зависит от задачи/проекта: нужно ли применять разбивку на слои или использовать ViewModel'и вместо обычных доменных моделей - надо думать над каждой ситуацией отдельно.

    P.S. На мой взгляд, литературу выбрали правильно - я тоже начинал изучение MVC с нее. Понравилась тем, что дается сначала общее описание и работа с ASP.NET MVC на сквозном примере. А потом идет более глубокое погружение в ASP.NET MVC. По разработке могу посоветовать блог Александра Бындю: blog.byndyu.ru Как мне кажется, там очень хорошо некоторые моменты разжевываются, в том числе SOLID, TDD, шаблон Repository, UnitOfWork и др.
    Ответ написан
    2 комментария
  • Как найти все файлы на диске Виндовс?

    Jump
    @Jump Куратор тега Windows
    Системный администратор со стажем.
    Во первых на диске могут быть не только файлы, но и служебная информация файловой системы.
    Во вторых файлы размером 20кб могут занимать на диске более гигабайта.
    В третьих у меня например на диске размером 2тб хранится более 10тб информации, при этом диск наполовину пуст.
    В четвертых стандартные средства просмотра диска не могут показать полной картины использования диска.

    Поэтому либо забейте на это дело, либо вдумчиво и серьезно изучите работу файловой системы.
    Ответ написан
  • Как организовать хранение данных в c# WPF (программа - заучивание иностранных слов)?

    andrewpianykh
    @andrewpianykh
    Из нативного я бы рекомендовал Microsoft SQL Server Compact + EntityFramework.
    Иначе, как уже писали выше, XML/JSON. По удобству работы в целом без разницы, для XML - Linq to XML, для JSON - JSON.NET
    Ответ написан
    Комментировать
  • Как сохранить предустановленную Windows 8.1 на только что купленном ноутбуке?

    BohdanK
    @BohdanK
    Да винда там обычная, с какими-то фирменными программами. Воспользуйтесь acronis true image, он создаст полный образ загрузочного диска.
    Ответ написан
    Комментировать
  • Как сохранить предустановленную Windows 8.1 на только что купленном ноутбуке?

    Jump
    @Jump Куратор тега Windows
    Системный администратор со стажем.
    Сделайте образ системного и загрузочного дисков, и играйтесь сколько хотите.
    Ответ написан
    Комментировать
  • Зачем нужны pagefile.sys и hibefil.sys?

    pagefile.sys - файл подкачки. Используется для хранения части оперативной памяти компьютера на жестком диске.
    hiberfil.sys – это файл, который создается вашей операционной системой для корректной работы режима гибернации. Когда операционная система переходит в режим гибернации, все содержимое оперативной памяти вашего компьютера перемещается на жесткий диск именно в файл hiberfil.sys
    Ответ написан
    3 комментария
  • Как объеденить 2 жестких диска ( не раздела) в один под windows?

    Jump
    @Jump Куратор тега Windows
    Системный администратор со стажем.
    Можно но проблем много.

    1. Можно объединить в программный рэйд нулевого уровня - но это довольно небезопасная конфигурация.
    2. Можно объединить в программный рэйд первого уровня - но это потеря половины пространства.
    3. Объединить диски можно с помощью storage spaces, однако тогда с них не загрузишься, а на SSD у вас как раз система, ну и вышеуказанные причины так же будут актуальны.
    4. Объединить их можно с помощью банальных симлинков, или монтирования диска в папку. Этот вариант вроде без проблем.
    Ответ написан
    1 комментарий
  • Как работает C#?

    Рекомендую книгу Рихтера "CLR via C#"
    Ответ написан
    Комментировать
  • Изучение c# путем создания игр, стоит ли идти по такому пути и какие есть варианты?

    AlexXYZ
    @AlexXYZ
    O Keep Clear O
    Программирование происходит в голове. Компьютер всего лишь средство выражения, так же как и windows forms. Приучите себя писать не только код, но и документацию. В общем программирование игр на игру совсем не похоже и обрастает кучей допработ, которые делать не всегда хочется, потому что а) я это миллион раз видел у других и б) я думал это должно работать само, а оно во как вышло, что мне нужно сделать то, что пользователи будут стремиться "пропустить" как назойливое препятствие на пути к экшену.
    Из маленьких наблюдений за профессией - просто делайте по одному два открытия/инсайта для себя, но каждый день. Сохраняйте темп, продолжайте бежать. :)
    Ответ написан
    Комментировать
  • COM: как портировать из MSVC в MinGW?

    @VZVZ
    Reverse-Engineer, Software Developer, Architect
    > У нас есть некая COM-библиотека, работающая на заголовках и инлайнах (TLH и TLI), генерируемых через директиву #import.
    Не совсем понял. У вас есть COM-библиотека, и вы ее "подключаете" с помощью #import к основному приложению - так что ли?

    И зачем вам эта линуксятина MinGW?
    Под винду надо и средства юзать виндовые...

    Ну если надо, то берем эти .tlh и .tli, объединяем в 1 хедер (для удобства) и долго и нудно удаляем все лишнее, все, что не поддерживает MinGW, прежде всего это свойства (property), которы[ в MinGW, естественно, в таком виде нету...
    Чтобы быть уверенным, что в итоге все будет работать - можно начать с малого, то есть сперва написать хелловорлдную COM-библиотеку с 1 простеньким интерфейсом, и все это провернуть с нею, а там и за основное дело браться.

    В моем случае получилось все сделать гораздо проще.
    Надо было на MinGW работать с ADO. Я не стал мучаться с #importом, а сперва глянул один из форков сего компилятора - MinGW-w64 - и обнаружил, что в нем уже есть такие хедеры, видимо, портированные то ли из VC++, толи из C++ Builder, что и обнадежило меня и я стал пробовать их в Visual Studio.
    В VS эти хедеры заработали, после чего сравнительно легко добавились в обычный MinGW, где заработали также. Сейчас на базе их строю высокоуровневую обертку в стиле ADO.NET, один и тот же код работает как в VS, так и в MinGW..
    Ответ написан
    3 комментария
  • Где и как найти шаблон проекта Windows Store в Visual Studio?

    @SZolotov
    Asp.net core, MAUI,WPF,Qt, Avalonia
    Uwp - это и есть шаблон для Windows store
    Ответ написан
    Комментировать
  • С чего начать изучения: с DirectX 9 или DirectX 11?

    @coderlex
    Абсолютно не важно, в новом API больше различий, чем похожего.

    Но 9-й - проще:

    - Если вы изучали OpenGL 1-2 на курсе графики в универе, то в 9-м найдете много похожих вещей.

    - В 9-м чтобы вывести примитивную Hello World картинку на экран не обязательно знать физику освещения для написания шейдера. Не нужно разбираться в языке программирования шейдеров HLSL. В целом достаточно прочитать пару глав какого-нибудь самоучителя - и вот готов первый результат.

    - 11-й имеет больше слоев абстракций даже на уровне Hello World, которые желательно понимать, чтобы не чувствовать себя обезьяной перед пультом управления адронного коллайдера =)

    Поэтому, для обучения с нуля (т.е. без курса компьютерной графики в универе или опыта OpenGL 2 за плечами) имхо лучше начинать с 9-ки.

    Но с другой стороны, если вы поставили целью выучить именно d3d11, то никаких препятствий на вашем пути возникнуть не должно. Просто нужно будет затратить чуть больше усердия и упорства.
    Ответ написан
    Комментировать
  • Есть ли альтернатива Windows Termilal?

    saboteur_kiev
    @saboteur_kiev Куратор тега Системное администрирование
    software engineer
    Поставьте git для винды, вместе с ним идет куча портированных утилит, включая bash
    ConEmu+FAR отличная оболочка для винды.
    Ответ написан
    Комментировать
  • C++ сеть. Как работать с сетью в C++?

    Olej
    @Olej
    инженер, программист, преподаватель
    Для работы с сетью (на сегодня сетью называют уже практически только TCP/IP) используется такая совершенно абстракция как сокеты (в программном коде).
    Можете немного глянуть здесь: Сетевое программирование в Linux.

    А что касается HTTP ... то это совсем другая песня - это вам нужно, прежде, разбираться с уровнями сетевой модели, сетевого стека. HTTP - это протокол прикладного уровня. В C++ ничего уже специально и не надо для протокола прикладного уровня, к сетевому программированию это уже и не имеет прямого отношения.
    Ответ написан
    Комментировать
  • Почему очень часто не отвечают на вопросы по опубликованным вакансиям на программиста-железячника Си/С++?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    1. Обычно на том конце провода рекрутер (часто из сторонней компании), который вообще не уполномочен отвечать и ему лишь бы по проще понять подходите ли вы и прокинуть вас дальше.
    2. Лучший вариант, самостоятельно искать компании, в которых вы бы хотели работать и отправлять туда резюме.
    3. Отправлять только(!) резюме. Вопросы про зарплатные вилки и прочее отложите на потом, они уместны только в конце собеседования. В остальных случаях они лишь отпугнут.
    4. Если вас что-то не устоит, вы всегда сможет отказаться даже после оффера, но главное вначале получить его)
    Ответ написан
    2 комментария
  • ADO.NET море проблем?

    Nipheris
    @Nipheris Куратор тега C#
    1) использовать EF7 с edmx невозможно, т.к. последний считается устаревшим форматом/подходом к хранению структуры БД (см. blogs.msdn.com/b/adonet/archive/2014/10/21/ef7-wha... Если все-таки очень хочется edmx - попробуйте установить EF6;
    2)
    что надо установить SQl Server

    установить надо было скорее всего Entity Framework Tools, что, в общем-то, логично. Для установки EFTools нужно при установке выбрать SQL Server Data Tools (см. https://github.com/aspnet/Tooling/issues/53 ), что тоже логично. Вы точно устанавливали их при установки студии? Обращаю ваше внимание, что это Tools, а не сервер.
    Ответ написан
    2 комментария
  • Почему не работает код (С++)?

    Therapyx
    @Therapyx
    Data Science
    int main() {
    	int x;
    	cin >> x;
    	if (x % 2 == 0 && x % 4 != 0) {
    		cout << x << endl;
    	}
    }

    % - высчитывает остаток, к примеру 13 % 2. в 13 поместится 6 раз 2 = 12. итого 1 остаток. Дак вот этот остаток и идет как итог после операции с %. Любое четное число будет иметь остаток 0 если его делить на 2, но не все делятся на 4, поэтому и x % 2 == 0 "И" x % 4 != 0
    Ответ написан
    Комментировать
  • Почему не работает код (С++)?

    @vilgeforce
    Раздолбай и программист
    if(x%4) continue; Что по вашему делает? И, в частности, чему будет равно 5%4?
    Ответ написан
    Комментировать
  • Зачем нужны матрицы в Direct3D?

    @Mercury13
    Программист на «си с крестами» и не только
    Начнём с того, что вектор имеет три координаты: x, y и z. Все повороты системы координат (x, y, z) → (x', y', z'), масштабирования и их комбинации можно записать в виде

    x' = a11·x + a12·y + a13·z
    y' = a21·x + a22·y + a23·z
    z' = a31·x + a32·y + a33·z

    А теперь прочитайте, что такое «умножить матрицу на вектор». Узнаёте? — матрицу {aij} размером 3×3 умножаем на вектор-столбец (x, y, z)T и получаем вектор-столбец (x', y', z')T. Здесь буква T — это операция «транспонировать матрицу», заменить строки столбцами, а столбцы — строками.

    А теперь сделаем финт ушами. Возьмём 4-векторы (r, s, t, d) и обозначим x=r/d, y = s/d, z = t/d (так называемые однородные координаты). Преобразование в однородные координаты неоднозначно: декартовы координаты (1, 2, 3) можно обозначить как четвёркой (1, 2, 3, 1), так и четвёркой (10, 20, 30, 10). Для чего нам однородные? Матрицы 4×4, работающие над однородными координатами, позволяют записать и такие преобразования, как «сдвинуть» или «центральная проекция». Например, «сдвинуть» записывается как

    r' = 1·r + shiftx·d
    s' = 1·s + shifty·d
    t' = 1·t + shiftz·d
    d' = d

    или, в терминах матриц
    [r']   ( 1 0 0 shiftx )   [r]
    [s'] = ( 0 1 0 shifty ) · [s]
    [t']   ( 0 0 1 shiftz )   [t]
    [d']   ( 0 0 0 1      )   [d]

    (тут я не поленился собрать тэгом code нечто похожее на вектор-столбец, так что знак транспонирования не нужен :)
    Ответ написан
    Комментировать
  • Зачем нужны матрицы в Direct3D?

    @Joysi75
    Число, вектор и матрица - это все массивы. Просто размерности разные. Матрица по сути можно представить как двумерный вектор (двумерный массив). Конечные матрицы естественно можно заменить векторами (одномерными массивами) - например, матрица 3х3 заменяется вектором из 9-ти элементов. Но со временем, оперировать матрицами Вы привыкнете и они будут для Вас нагляднее.

    И используя конечное число операций с матрицами можно выполнить поворот, масштабирование и иные операции с фигурами.

    Я рекомендую Вам почитать побольше про матрицы. Для многих действий с ними хватает и знаний средней школы.

    Например, habrahabr.ru/post/131931
    Ответ написан
    1 комментарий