Подлипенский Павел

Блог о технологиях и деньгах

Этический вопрос: Ошибки в конструкторе…

clock декабря 11, 2008 12:03 by author Подлипенский Павел
Я, как вы знаете, пишу не только статьи в свой блог, но и код. Программный код. Поэтому, меня зачастую интересуют вопросы, которые нормальным людям в голову и не лезут. Суть сегодняшней дилеммы очень простая – хорошо ли генерировать исключительные ситуации из конструктора? Это скорее философский или этический вопрос, нежели сложная техническая задача. И все же.

Конструкторы не возвращают каких-либо значений, поэтому было бы здорово сгенерировать ошибку, в случае, если объект не может быть создан. И таким образом, оповестить всех что этот объект использовать дальше нельзя. Уже слышу протестующие крики в свой адрес: “…Конструкторы предназначены для простых операций типа инициализации объекта…” или “…Лучше после попытки создания объекта проверить его на null…”.

А я не согласен с этим!

Когда мы передаем в конструктор некие параметры, мы обязаны проверить их на валидность. А как вы сообщите об “испорченном” параметре? С помощью null? Что? Опять протесты?

“…А давайте оставим конструктор пустым и добавим метод Initialize, который и вернет нам необходимый код состояния инициализации объекта…”

Хм, а конструкторы тогда зачем? Для тех, кто все еще сомневается в моих доводах, советую прочесть презентацию Bjarne Stroustrupsa (он настолько крутой, что придумал С++) об “Standard-Library Exception Safety”. И там, все вышесказанное, размазано по 36 страницам. Поэтому генерировать исключительные ситуации в конструкторе – это нормально (особенно, если вы исповедуете RAII).

В C#.NET есть еще одна приятная особенность – finalizer вызовится даже в случае ошибки в конструкторе и ресурсы будут освобождены корректно. Кстати и в самом .NET Framework многие базовые классы генерируют исключительные ситуации из конструктора, например Guid, DateTime, Queue, FileStream и другие.

А вы генерируете ошибки в конструкторах?

Текущий рейтинг: 5.0 (4 голосов)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Решарпер: жизнь после релиза

clock августа 13, 2008 08:00 by author Подлипенский Павел

Я уже писал о фичах последнего решарпера, а сейчас хочу поговорить о будующих фичах этого замечательного продукта. Разработчики обещают оптимизировать работу с памятью и увеличить скорость работы продукта. В дополнение к этим улучшениям будет реализовано следующее:

  1. Будут добавлены новые способы/методы рефакторинга кода. Большинство из них будут из inline "семейства".
  2. Планируется расширить функционал для работы с соглашениями по кодированию. "Мы не собираемся реализовывать функционал AgentSmith плагина, мы лишь хотим избавить наших пользователей от рутиной работы" - заявляют разработчики.
  3. Также будет добавлена новая фича под названием Visual Build, целью которой будет отображать процесс сборки проекта в студии. Фича была заявлена как платформа для будующей фичи по оптимизации процесса сборки.
  4. Ожидается полная поддержка Visual Basic 9 с его анонимными функциями и XML литералами.

И не забывайте, что все вышеописанное возможно благодаря вашим feedback'ам и даже идеям.

Ссылки по теме:

Прорезь в копилке с идеями (бросать только идеи на $1 млн.)

База знаний Решарпера

Официальный сайт Resharper'a 

Текущий рейтинг: 5.0 (7 голосов)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Что нового в Resharper 4.0?

clock июня 16, 2008 09:30 by author Подлипенский Павел

Ребята из JetBrains выпустили новый решарпер и теперь он доступен для "покупки" и скачивания с их официального сайта.

Пожалуй самая интересная фича нового решарпера - поддержка C# 3.0 и LINQ. Но первая вещь которую я заметил, это "Reformat" переименовали в "Cleanup Code", и поначалу, это сбивало с толку. Зато сейчас эта фича поддерживает профайлы, т.е. различные профайлы могут делать различные "очистки кода": переход к авто-свойствам, использование анонимных типов, формирование readonly полей, если это возможно и многое другое.

 

Но единственное, что у меня пока не получилось - это редактирование стандартных профайлов.

Следующее, на что я обратил внимание это инициализация объектов, к примеру если я напишу

Task t = new Task(); t.Name = "Test";

То решарпер мне предложит поступить следующим образом:

Task t = new Task {Name = "Test"};

Аналогичным образом решарпер предлагает использовать implicit type variable:

Решарпер советует использовать var везде, где это возможно. Такое решение далеко не всегда оправдано, поэтому я отключил этот функционал.



Зачатки JetBrains.Annotation были еще в решарпере версии 2.5. Если помните был такой "Null Reference Analysis", который оповещал разработчика о возможных NullReferenceException в коде. Чтобы избежать такого анализа разработчики добавляли к свойствам, атрибуты NotNull или CanBeNull, которые решарпер позже использовал для инициализации состояния переменных. В новой же версии количество таких атрибутов значительно увеличилось. Скажем, если вы хотите явно указать, что ваш строковый параметр будет обрабатываться с помощью string.Format, то можете написать следующее

[StringFormatMethod("key")] public void Put(string key, params object[] args) { ... }

После чего вызвав эту функцию

Put("testing {0}, {1}, {2}", 1, 2);
решарпер подскажет, что переменная для аргумента {2} отсутствует. Но использования этой фичи требует включения нескольких JetBrain библиотек в ваш проект, что несколько смущает...

Довольно удобным стал CamelHumps Completion, позоволяющий писать лишь заглавные буквы ключевых слов, названий классов, переменных:

if(CVM.I.SV(SCV.FU 
После нажатия магического сочетания клавиш <Ctrl-Shift-Enter>, получаем
if (CodeViewManager.Instance.SupportsView(StandardCodeViews.FindUsages)) { }

Как я уже упоминал, теперь решарпер полностью поддерживает C# 3.0 и LINQ, что не может не радовать.

 

Recent Edits позволяет быстро получить доступ к недавно редактируемым участкам кода (CTRL + "-" уже просто достал!):

 


И в заключение, хочу добавить, что создатели решарпера клянутся, что он стал быстрее, особенно в обработке ASP.NET кода.

Полезные ссылки:

Официальный сайт решарпера

Новые фичи четвертого решарпера 

Скачать Resharper 4.0 

Купить Resharper 4.0 

Блог Ильи Рыженкова, продукт-менеджера компании JetBrains 

Текущий рейтинг: 4.7 (6 голосов)

  • Currently 4,666667/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Как упростить доступ к значениям в словаре?

clock июня 12, 2008 09:32 by author Подлипенский Павел

Речь пойдет о коллекциях IDictionary. Не знаю как вам, но мне надоела постоянная проверка .ContainsKey(), каждый раз, когда я хотел получить значение из словаря.

Dictionary<string, string> dict;
if (dict.ContainsKey("key"))
	value = dict["key"];
else
	value = "defaultValue";

Поэтому мне пришлось реализовать такую вот нехитрую обертку:

public static class MyExtensions
{
	public static TValue GetValue<TKey, TValue>(
	this IDictionary<TKey, TValue> source, TKey key, TValue defaultValue)
	{
		if (source.ContainsKey(key))
			return source[key];
		else
		return defaultValue;
	}
}

И теперь получить значение стало намного проще:

value = dict.GetValue("key", "defaultValue");

Текущий рейтинг: 4.1 (7 голосов)

  • Currently 4,142857/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Search


LinkedIn Profile

Tags

Posts

  • Pingback from 241.akemet.com Cb300 Second Hand Address, Cb3000 Video Price Marine Engines
    241.akemet.com

  • http://tvsh2004.narod.ru/gm03.html
    test

  • конечно это очень дорого, у нас ведь вся страна пользуется только лицензионной windows...
    Славян

  • Алексей: С удовольствием!
    Подлипенский Павел

  • Присоединяйтесь к ЖЖ-коммьюнити http://community.livejournal.com/ua_extjs
    Алексей

  • Поправка насчет генерации самого хтмл-кода для ответа веб метода. Предлагаю сделать проще, не создавая объекта страницы и без тега <form> [WebMethod] public string GetControlHTML(string controlLocation) { HtmlTextWriter tw = new HtmlTextWriter(new StringWriter()); var uc = (UserControl)(new UserControl()).LoadControl(controlLocation); uc.RenderControl(tw); return tw.InnerWriter.ToString(); }
    Anthony

Categories

Calendar

<<  Сентябрь 2010  >>
воповтсрчепясу
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

Archive

© Copyright 2010

Sign in

Ó÷àñòíèê ïëàíåòû Developers.org.ua

Bookmark and Share

Web Developement Blogs - Blog Catalog Blog Directory