• Книга по шаблонам проектирования?

    DimonSmart
    @DimonSmart
    Kaspersky Lab Developer
    Если с паттернами только начинаешь знакомиться то очень последовательное изложение в книге Фримен, Фримен, Сьерра: Паттерны проектирования
    Её рекомендую читать в бумаге прямо с начала и последовательно.

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

    Про классику - если уже очень хорошо знаешь что такое паттерны и имеешь по ним своё мнение - читать можно. Для изучения с начала - не очень подходит.
    Ответ написан
    Комментировать
  • Где найти интерактивное изучение js?

    evgeniy8705
    @evgeniy8705
    Повелитель вселенной
    nnmclub.to/forum/viewtopic.php?t=973073&start=45
    Единственный курс, в котором подробно изучается сам стандарт ES.
    Очень много практических заданий.
    Тем более обучение основано на изучении по учебнику Ильи Кантора.
    Тем более преподаватель бывший сотрудник Яндекса, нынешний сотрудник Lusoft
    Обучение длится 48 часов. Это только видеолекции, не считая времени на практику.
    По ES в курсе достаточно большое количество задач после каждой лекции, по JS также много задач из учебникак Ильи Картора, плюс выполняются такие работы как Слайдер, ToDo list, RSS ридер, корзина интернет магазина с local storage, а также выпускные проекты, сайт и игра.

    Этого курса + книги на learn.javascript.ru будет достаточно чтобы получить очень хорошую базу, конечно если выполнять все задания.
    Ответ написан
    1 комментарий
  • Codewars - поможет ли?

    @DanSorokin
    Full-stack developer at onvoya.com
    Пару раз туда заходил, не сказал бы, что там сложные задания. https://codefights.com/ и freecodecamp.com отличные ресурсы для тренировки. На 100% уверен, что стоит решать разного рода задачки, пусть даже они не относятся конкретно к предметной области javascript.
    Ответ написан
    6 комментариев
  • Как эффективно работать целый день?

    @apletnev
    По своему опыту выделил для себя следующие правила.
    Физика:
    1. Питание. Обрати внимание на сахар и быстрые/медленные углеводы. Например, если утром поесть овсяную кашу то энергии хватит на 4-5 часов, если бутерброды, - часа на два. Так по крайне мере у меня.
    2. Физические нагрузки, спорт отнимает много времени, хотя очень эффективен. Самый простой способ - побольше ходить, если пользуешься общ. транспортом, то выходить на несколько остановок раньше. Еще можно отжиматься, где-то читал что сто отжиманий в день - тонус для всех мышц тела.
    3. Сон. Как и другие рекомендую 7-8 часов, однако нужно обратить внимание на матрас, температуру и влажность в комнате - это намного улучшит качество отдыха.
    4. Жидкости. Я пью обычную воду, стараюсь выпивать 2 литра на работе (у меня есть вот такая фляга )
    5. Свежий воздух в офисе, яркость света. Стараться работать согласно нормам описаным в охране труда, т.е. должно быть много света, должен быть приток свежего воздуха.
    6. Эргономика стола. Обязательно нормальный стул, стол, монитор, клавиатура. Многие пренебрегают этими вопросами, а потом в 30 лет грыжи в позвоночнике, туннельный синдром, линзы/очки и половая дисфункция. (Я понимаю что в 18 лет это звучит как что-то далекое и не про тебя, однако если ты планируешь связать свою жизнь с разработкой, нужно думать о туловище, а не только о мозге)

    Психика:
    1. Будут дни когда работа не прет, абсолютно. Отпустить и забыть, но не увлекаться.
    2. Дисциплина. Так как мозг считай мышца, нужно постоянно тренировать ее; - писать код. В конце концов мозг привыкнет к нагрузке и сможет решать любые задачи и быстро, но будут дни как в первом пункте.
    3. Супер важные ежедневные задачи. Для меня это учеба и английский. Я этим занимаюсь не зависимо от дня недели, праздников, событий. Т.е. даже если я узнаю что через три дня конец света, все равно буду оставшиеся дни делать то что и делал раньше. Можно смеяться и крутить пальцем у виска, но нужно объяснить мозгу, что не может быть никаких проволочек, никаких отмазок. Иными словами “сдохни, но сделай”. Этот навык мне позволяет в случае аврала или какой-то мегалажи не паниковать и планомерно решать задачи. (Лучше начинать потихоньку иначе пункт первый на несколько лет)

    Через пол года у твоего мозга закончится адаптационный период и в этот момент начинай думать о своем туловище, оно не будет тебя отвлекать от решения любых умственных задач.
    Книги:
    https://pragprog.com/book/jkthp/the-healthy-programmer
    www.ozon.ru/context/detail/id/4320305
    Ответ написан
    3 комментария
  • Что делать дальше после изучения основ javaScript + jquery?

    dmitry_pavlov
    @dmitry_pavlov
    World-class .NET freelance contractor (remotely)
    Совет - устройтесь на работу: Где можно найти работу для повышения навыков?
    Дальше само все пойдет.

    P.S. Вы же не хотите изучать ради изучения? Наверное, цель - начать зарабатывать этим ремеслом? Если так, то логичным будет достигать поставленной цели, а не придумывать себе очередной шаг, приближающий к ней. Это проще и точно не окажется, что шаг выбрали неверный.

    UPDATE: наткнулся вот на статью ain.ua/2016/06/22/656143 - Практическое руководство для тех, кто хочет стать профессиональным веб-разработчиком
    Ответ написан
    6 комментариев
  • На каких IT-специалистов выше спрос за рубежом?

    @qazqazasda
    Спрос на профи.
    И на рынке бьются друг с другом излишки непрофессионалов, которые работают за еду.

    Чтобы стать профи нужно очень много лет потратить.


    Чтобы тратить много лет и это не было скучно, чтобы не устать и не отступиться - всего-то заниматься нужно тем, что лично тебе интересно.
    Ответ написан
    2 комментария
  • Как обработать все ошибки (перехваченные и неперехваченные) в ASP.Net MVC?

    andrewpianykh
    @andrewpianykh
    Я предпочитаю следующий подход:

    1. Создаем контроллер ErrorController, например так:

    public class ErrorController
    {
    	public virtual ActionResult BadRequest()
    	{
    		return View();
    	}
    
    	public virtual ActionResult Forbidden()
    	{
    		return View();
    	}
    
    	public virtual ActionResult Index()
    	{
    		return View();
    	}
    
    	public virtual ActionResult NotFound()
    	{
    		return View();
    	}
    }


    2. Добавляем вьюхи

    3. Создаем свой расширенный HandleErrorAttribute, например так:

    public class ExtHandleErrorAttribute : HandleErrorAttribute
    {
    	//private readonly ILogger logger;
    
    	public ExtHandleErrorAttribute(/*ILogger logger*/)
    	{
    		//this.logger = logger;
    	}
    
    	public override void OnException(ExceptionContext filterContext)
    	{
    		if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
    		{
    			return;
    		}
    
    		if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
    		{
    			return;
    		}
    
    		if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
    		{
    			return;
    		}
    
    		if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
    		{
    			filterContext.Result = new JsonResult
    			{
    				JsonRequestBehavior = JsonRequestBehavior.AllowGet,
    				Data = new
    				{
    					error = true,
    					message = filterContext.Exception.Message
    				}
    			};
    		}
    		else
    		{
    			var controllerName = (string)filterContext.RouteData.Values["controller"];
    			var actionName = (string)filterContext.RouteData.Values["action"];
    			var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
    
    			filterContext.Result = new ViewResult
    			{
    				ViewName = View,
    				MasterName = Master,
    				ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
    				TempData = filterContext.Controller.TempData
    			};
    		}
    
    		//var e = filterContext.Exception;
    		//logger.Error(e, e.Message);
    
    		filterContext.ExceptionHandled = true;
    		filterContext.HttpContext.Response.Clear();
    		filterContext.HttpContext.Response.StatusCode = 500;
    		filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
    	}
    }


    4. Регистрируем глобальный фильтр:
    public class FilterConfig
    {
    	public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    	{
    		var extHandleErrorAttribute = DependencyResolver.Current.GetService<ExtHandleErrorAttribute>();// new ExtHandleErrorAttribute();
    		filters.Add(extHandleErrorAttribute);
    	}
    }


    5. В Global.asax.cs добавляем метод Application_Error:

    protected void Application_Error(object sender, EventArgs e)
    {
    	var httpContext = ((MvcApplication)sender).Context;
    
    	var currentRouteData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
    	var currentController = " ";
    	var currentAction = " ";
    
    	if (currentRouteData != null)
    	{
    		if (currentRouteData.Values["controller"] != null && !String.IsNullOrEmpty(currentRouteData.Values["controller"].ToString()))
    		{
    			currentController = currentRouteData.Values["controller"].ToString();
    		}
    
    		if (currentRouteData.Values["action"] != null && !String.IsNullOrEmpty(currentRouteData.Values["action"].ToString()))
    		{
    			currentAction = currentRouteData.Values["action"].ToString();
    		}
    	}
    
    	var ex = Server.GetLastError();
    
    	var controller = new ErrorController();
    	var routeData = new RouteData();
    	var action = "Index";
    
    	if (ex is HttpException)
    	{
    		var httpEx = ex as HttpException;
    
    		switch (httpEx.GetHttpCode())
    		{
    			case 404:
    				action = "NotFound";
    				break;
    
    			case 403:
    				action = "Forbidden";
    				break;
    
    			case 400:
    				action = "BadRequest";
    				break;
    
    			default:
    				action = "Index";
    				//var logger = DependencyResolver.Current.GetService<ILogger>();
    				//logger.Error(ex, ex.Message);
    				break;
    		}
    	}
    
    	httpContext.ClearError();
    	httpContext.Response.Clear();
    	httpContext.Response.StatusCode = ex is HttpException ? ((HttpException)ex).GetHttpCode() : 500;
    	httpContext.Response.TrySkipIisCustomErrors = true;
    	routeData.Values["controller"] = "Error";
    	routeData.Values["action"] = action;
    
    	controller.ViewData.Model = new HandleErrorInfo(ex, currentController, currentAction);
    	((IController)controller).Execute(new RequestContext(new HttpContextWrapper(httpContext), routeData));
    }


    6. В web.config добавляем в system.web
    <customErrors mode="On" />

    также в system.webServer можно добавить:

    <httpErrors>
      <remove statusCode="400" subStatusCode="-1" />
      <remove statusCode="403" subStatusCode="-1" />
      <remove statusCode="502" subStatusCode="-1" />
      <remove statusCode="501" subStatusCode="-1" />
      <remove statusCode="500" subStatusCode="-1" />
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="400" prefixLanguageFilePath="" path="/Error/BadRequest" responseMode="ExecuteURL" />
      <error statusCode="404" prefixLanguageFilePath="" path="/Error/NotFound" responseMode="ExecuteURL" />
      <error statusCode="500" prefixLanguageFilePath="" path="/Error" responseMode="ExecuteURL" />
      <error statusCode="501" prefixLanguageFilePath="" path="/Error" responseMode="ExecuteURL" />
      <error statusCode="502" prefixLanguageFilePath="" path="/Error" responseMode="ExecuteURL" />
      <error statusCode="403" prefixLanguageFilePath="" path="/Error/Forbidden" responseMode="ExecuteURL" />
    </httpErrors>
    Ответ написан
    Комментировать
  • Туториал по разработке веб-приложения от начала до конца?

    Я бы рекомендовал именно METANIT, потому что там есть описание важных моментов, а именно - архитектура приложения. Этот момент в русскоязычной литературе описывается очень скудно.
    Ответ написан
    Комментировать
  • На чем писать фронтенд легко и непринужденно?

    ymatuhin
    @ymatuhin
    Front end разработчик
    Легко и непринужденно получится писать после пары лет опыта. Проще всего для старта научиться что-то делать на html, js, css.
    После этого имеет смысл накрутить инструменты и фреймворки. Я бы рекомендовал npm-scripts, webpack/rollup, postcss. Из фреймворков каждый выбирает что нравится или что востребовано. Вам рекомендую Angular 1/2 или React, с ними всегда найдете работу. Если для себя и своих проектов, то тут выбор побольше. Мне нравится Riot.
    А чтобы писать «красиво и легко сопровождаемо» тут вопрос совсем не в фреймворке, а в понимании паттернов, дебагинга, проектирования, тонкостей языка и кодстайла.
    Удачи.
    Ответ написан
    Комментировать
  • Как выучить английский начинающему программисту?

    sloboda
    @sloboda
    Java QA Automation
    Приложение на смартфоне duolingo
    Оно бесплатное
    Слушайте подкасты IT от Luxoft и др. Так как многие
    слова поймете из контекста, а спикеры все-таки не англоговорящие и потому говорят не так быстро,
    таким образом начнете понимать на слух.
    Найдите единомышленников и старайтесь общаться с ними на английском. Пусть будет криво. Зато в мозгу преодолеется барьер.

    Окружите себя языком.

    Не используйте русский в меню смартфона, в меню всяких программ и операционной системы.
    Всё, что возможно, замените на английский.

    Все эти способы бесплатны и эффективны.
    Ответ написан
    Комментировать
  • Делаете ли вы гимнастику для глаз?

    neochar
    @neochar
    PHP vs Python
    Я делаю гимнастику перед сном. Обычно не забываю, т.к. глаза сами напоминают.
    Выполняю круговые движения по часовой, против часовой. Затем полукруговые движения по часовой и против часовой сверху, затем снизу. Затем простые движения сверху-вниз и снизу-вверх, слева-направо и справа-налево.
    Не знаю, получится ли у вас это делать в темноте, но ещё очень эффективное упражнение, которое я выполняю в завершении, - это смена фокуса. Очень хорошо снимает усталость с глаз. Можно делать при освещении, можно делать в любое время суток и несколько раз в день. Просто берёте две точки фокуса на большом расстоянии друг от друга (это можно делать и мысленно, тогда получится совмещать с упражнениями перед сном) и медленно переключаетесь между ними, смотря сначала на ближнюю, затем на дальнюю точки.
    На каждое упражнение можно тратить около минуты.
    Ответ написан
    Комментировать
  • C# Троелсен и Шилд, поворот не туда?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Троелсен пишет профессионалам, тем, кто уже профессиональный разработчик в каком-либо языке, а теперь хочет разобраться с C#. Раз книга направлена на профессионала, то в ней не указываются общие основы программирования - например, нет ничего про паттерны, нет инфы, для чего нужен ООП, какие типы данных выбрать для конкретной задачи, какие типы массивов/списков взять, и т.п. Например, в книге описаны три разных способа работы с потоками. Каждый из типов хорошо описаны, но не указаны, какой из способов лучше использоваться. (хотя, конечно же, автор пытался показать, для чего нужны эти типы и в чем они отличаются, но выбор конкретного типа работы с потоками нужно выбирать разработчику.)
    Например, если разработчик хорошо знает Java. Тогда для него книга Троелсена идеальна. Можно понять, что в языке есть и как этим пользоваться.
    В итоге, эта очень сильная книга, которую легко можно использовать как справочник.
    Поэтому, эту книгу я не рекомендую как учебник программирования. Но когда вы пару-тройку лет поработаете с шарпом, то эта книга даст полное развёрнутое описание языка.

    P.S. Шилдта я не читал, не могу рассказать, на что она направлена.
    Ответ написан
    4 комментария
  • Где найти примеры проектов на asp.net mvc?

    Вот официальный репозиторий, там есть примеры:
    https://github.com/aspnet/Mvc

    Так же, там дается ссылка на хороший шаблон проекта:
    https://visualstudiogallery.msdn.microsoft.com/6cf...

    Еще ссылки из архива:
    https://github.com/imranbaloch/ASPNETIdentityWithOnion
    www.aspnetboilerplate.com
    https://genericunitofworkandrepositories.codeplex.com/
    Ответ написан
    Комментировать
  • Microsoft Dynamics CRM - как разобраться/потренироваться?

    nki
    @nki
    bezkart.ru готовая система лояльности
    Можно заказать двух-недельный демо доступ у поставщиков этого решения. Я лично так делал. Погуглите такие компании.
    Ответ написан
    Комментировать
  • Какую запись делать в трудовой?

    @iv_k
    программист, если без ВО
    инженер-программист, если с техническим ВО
    Ответ написан
    Комментировать
  • Стоит ли идти из радиотехники в IT?

    @glenean
    Нужно выбрать смежную область, например микроконтроллеры или ПЛИС.

    Буквально сегодня ввел на youtube запрос "DSP" или "сигнальные процессоры" с желанием посмотреть какие-то уроки, но ничего на русском языке не нашел.

    Лекции физтеха:
    "Цифровая обработка сигналов"
    1-я лекция из курса "Цифровая обработка сигналов"
    ДВПФ периодических последовательностей
    Дискретный во времени ряд Фурье
    Ответ написан
    2 комментария
  • Как легче освоить внедрение зависимостей, 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 комментария
  • Почему не стоит вызывать методы в конструкторе?

    @smozhaykin
    На самом деле вызывать не стоит только виртуальные методы. Т.к. если класс наследник его переопределит, то возникнет ситуация, когда метод работает до вызова конструктора класса-наследника. И если в этом методе используются какие-нибудь поля класса-наследника, они могут быть еще непроинициализированы.

    А так как в Java

    In Java, all non-static methods are by default "virtual functions." Only methods marked with the keyword final, which cannot be overridden, along with private methods, which are not inherited, are non-virtual.


    то в конструкторе не стоит вызывать любые публичные не final методы.

    Ниже C# код (т.к. работаю в основном с этим языком), иллюстрирующий это.

    void Main()
    {
    	new B("name");
    }
    
    class A
    {
        public A()
    	{
    	     Method();
    	}
    	
    	protected virtual void Method()
    	{
    	}
    }
    
    class B : A
    {
        private string Property { get; set; }
    	
    	public B(string value)
    	{
    	    Property = value;
    	}
    	
        protected override void Method()
    	{
    	    Console.WriteLine(Property.Length);
    	}
    }


    Результат: Object reference not set to an instance of an object.

    StackTrace
    at UserQuery.B.Method()
    at UserQuery.A..ctor()
    at UserQuery.B..ctor(String value)
    at UserQuery.Main()
    Ответ написан
    Комментировать
  • В какой программе создавать резюме в формате PDF?

    rasswet
    @rasswet
    еще можно из любой программы распечатать на виртуальный пдф принтер, например doPDF. Он бесплатный.
    Ответ написан
    Комментировать