• Какие книги посоветуете для будущего Team Lead'a?

    @Kirill-Gorelov
    С ума с IT
    Прикреплю скриншотами, лень печатать(((
    И еще посоветую книгу Дж. Рейнвотер: Как пасти котов
    Может что-то немного устарело, но в целом отличный материал.
    spoiler

    5cff50592e347804067839.png
    5cff506086eb5906138483.png
    5cff506887411407637707.png
    5cff506cec673723489011.png
    5cff5071c2002654406289.png
    Ответ написан
    Комментировать
  • LINQ to Entity Framework — базовый класс для работы с БД? (C#)?

    Paulskit правильно сказал, что автор пытается написать паттерн Repository. А Lam правильно написал как сделать GenericRepository.
    Пример обобщённого репозитория, кстати, есть здесь www.asp.net/mvc/tutorials/getting-started-with-ef-...
    Я в своём первом проекте его использовал. На самом деле, лично в моём понимании, это не очень хорошо.
    Сейчас ваш метод возвращает объект по его ID. Предвижу, что следующим методом будет получение группы объектов и возвращение IQueryable. Такой подход невольно заставляет писать код выборки объектов где-нибудь (в контроллере, в слое сервиса), но не в репозитории, что приводит к путанице. На мой взляд, лучше делать не обобщённый репозиторий, а уникальный репозиторий для каждой сущности, необходимой для работы программы.
    Предположим, что у вас есть класс BlogPost. Вы хотите иметь возможность загружать этот объект по ID, загружать вообще все эти объекты в память, загружать только часть этих объектов в память, загружать объекты с определённым условием и т.д. Для этого мы можете создать BlogPostRepository и написать в нём эти методы. Тогда ваша программа станет логичнее и понятнее. При работе с блогами вам не нужно будет каждый объявлять обобщённый репозиторий и городить поверх него запросы типа
    var repository = new GenericRepository<BlogPost>();
    var blogs = repository.GetAll().Skip(100).Take(10).OrderByDescending(c => c.Created);

    Ну или как-то так (код примерный). Причём такие конструкции придётся городить в любом месте, где понадобится получить 10 последних блогов.
    Проще сделать не обобщённый репозиторий, а специальный репозиторий для нужного объекта, тогда получится примерно так:
    var repository = new BlogPostRepository();
    var blogs = repository.GetTenTopBlogs();

    В методе GetTenTopBlogs, соответственно, инкапсулируете логику выборки последних 10 блогов. Разумеется GetTenTopBlogs может иметь параметры (например количество блогов, которые нужно получить). Тут уже всё зависит от задач. И GetTopBlogs Должен возвращать IEnumerable, чтобы вызывающий код уже оперировал с сущностями в памяти, а не строил новые запросы к БД.
    В целом код становится лаконичнее. Вам не нужно теперь каждый раз, чтобы что-то получить, объявлять обощённый репозиторий, тащить из него Queryable коллекцию и делать на ней выборку. Вы только вызываете метод и уже получаете результат. Теперь в вызывающих классах нет логики выборки.
    Примерно так... :)
    У Александра Бындю есть хорошие статьи на эту тему.
    blog.byndyu.ru/2011/08/repository.html

    Кстати, только заметил. Насколько я могу судить, репозиторий не должен знать об объекте DbContext. Это нужно для того, чтобы реализовать паттерн Unit Of Work. Представьте, что вы хотите совершить несколько транзакий (операций с репозиторием). Причём если хотя бы одна из них прошла неудачно, нужно всё откатить обратно. Предположим, что вы хотите сохранить 3 разных сущности в базу. Для этого вы написали свой обобщённый GenericRepository и объявили три переменных для каждой сущности. Причём у вас в этом GenericRepository будет функция Save (иначе как вы будете сохранять свои сущности).
    Выходит, что каждый экземпляр класса GenericRepository будет содержать свою копию DbContext, и каждый раз после добавления сущности вы будете сохранять базу.
    Единой транзакции не получится.
    Чтобы получилась, нужно передавать DbContext в конструктор репозитория и ничего не сохранять в репозиториях. Т.е. вы где-то объявляете свой контекст, затем создаёте три репозитория и в каждый из них передаёте этот контекст. Делаете все операции, после чего сохраняете контекст в вызыывающем класе. Получается UoW. Хотя DbContext - это уже UnitOfWork.
    По ссылке выше это тоже обсуждается (смотрите там рекоммендованные ссылки).

    p.s. Paulskit дал хорошую ссылку, я как раз её пытался найти.
    Lam тоже говорит правильно о том, что общие методы можно, конечно, вынести в обобщённый репозиторий. Только зачастую там этих методов - 1-2, а доброй трети сущностей эти методы вообще не понадобятся, так что я бы не стал делать лишнюю иерархию только для того, чтобы всем репозиториям назначить базовый класс.
    Ответ написан
    Комментировать
  • Плохо ли создавать проекты с нуля? Что значит быть про?

    saboteur_kiev
    @saboteur_kiev Куратор тега Веб-разработка
    software engineer
    "И соц. сети писал, и форумы и сервисы"

    Где ваша соцсеть хотя бы на десяток тысяч абонентов?
    Есть ваш форум, с ежедневным онлайном хотя бы 1000 человек?
    Что за сервисы, насколько они востребованы?

    Когда появится проект чуть побольше, чем тот, что помещается в вашу голову, и нужно будет позвать еще несколько программистов, чтобы успевать поддерживать и разрабатывать, писанине на коленке придет белый пушистый зверек, потому что организовать одновременную работу даже 10 человек у вас так, без классов, без ООП, без инкапсуляций и так далее - просто не выйдет.
    Ответ написан
    13 комментариев
  • С чего начинать проектировать приложение?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Предположим, что с будущей функциональностью Вы определились. Тогда Вы точно знаете, кто или что будет поставлять данные, и кто/что будет их потреблять.

    Теперь выясните, кто будет обращаться к вашей системе, чтобы передать или забрать данные, а к чему будет обращаться Ваша программа. Те системы или пользователи, которые обращаются к программе сами, нарисуйте схематически на листе бумаги вверху. Те, к которым будет обращаться программа (включая БД), - снизу.

    Теперь нарисуйте под каждым нарисованным сверху субъектом прямоугольник с названием UI или API - это интерфейсы, к которым будет обращаться пользователь или внешняя управляющая система. Иногда UI тоже может обращаться к API. Объедините все прямоугольники с UI одним контуром и обзовите слоем UI. Объедините все прямоугольники с API и обзовите слоем сервисов.

    Для систем, нарисованных снизу, укажите компоненты, которые будут отвечать за доступ к этим системам. Объедините все эти компоненты одним контуром и обзовите слоем доступа к данным.

    Между слоем сервисов и слоем доступа к данным нарисуйте большой контур и назовите его слоем бизнес-логики. В маленьких прямоугольниках внутри этого контура перечислите основные бизнес-задачи. Один компонент Вашей системы будет решать одну бизнес-задачу.

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

    Получите логическую архитектуру. Разбросайте слои по серверам - получите физическую архитектуру.

    А дальше - детально прорабатывайте каждый маленький квадратик. Всё.
    Ответ написан
    2 комментария
  • Какие хорошие книги по алгоритмам для .Net программистов вы знаете?

    @TiPo
    Кормен: "Алгоритмы. Вводный курс."
    В этой книге нет привязки к языку. Да и не нужно.
    Ответ написан
    Комментировать
  • Какие хорошие книги по алгоритмам для .Net программистов вы знаете?

    CyberBionic Systematics ITVDN "Вебинар на тему "Сравнение алгоритмов сортировки данных"
    https://www.youtube.com/watch?v=Xyr1sOQ4-Ak
    Ответ написан
    Комментировать