Рефракторинг кода в VS.NET 2005…

Конечно, рефракторинг в VS оставляет желать лучшего, особенно если сравнивать допустим с NetBeans (бесплатная IDE для Java программинга). Но как говорится, мал золотник да дорог. Так что рефракторим, что дают.

Кликаешь правой кнопкой на коде и в меню Refractor видишь следующие пункты:

  1. Rename
  2. Extract Method
  3. Encapsulate Field
  4. Extract Interface
  5. Promote Local Variable to Parameter
  6. Remove Parameters
  7. Reorder Parameters

Пройдемся по подробнее:

Rename - он и в России ринэйм. Переименовывает все что душе угодно. При этом ты можешь проследить за тем, что конкретно переименовывается, если поставишь флажок Preview Reference Changes.

Extract Method - в процессе создания какого-либо метода, он может получиться очень большим, что влиеят на читабельность. Extract Method позволяет “дробить методы” на более мелкие составные части. Рассмотрим как работает эта опция:

К примеру у тебя есть такой метод:

public void setColor(String color)
        {
            this.color = color;
            Console.WriteLine(LightCar -  + color);
        }

Конечно, здесь и рефракторить нечего, но представь, что в метод ты передаешь туеву кучу параметров и все их присваиваешь полям объекта(this. this. this. ….). От этой громоздкости можно уйти, выделив this.color = color; (и др.) и нажав Extract Method. В итоге код переписывается:

public override void setColor(String color)
        {
            ExtractMethod(color);
            Console.WriteLine(LightCar -  + color);
        }

        private void ExtractMethod(String color)
        {
            this.color = color;
        }

Пример конечно все равно не удачный, ну я думаю, ты понял, чем тебе может помочь Extract Method.

Encapsulate Field - если помнишь инкапсуляция - это сокрытие реализации класса и отделение его внутреннего представления от внешнего. Все знают, что поля класса должны быть private, а доступ к ним должен обеспечиваться с помощью свойств, которые реализуются с помощью геттеров и сеттеров(немного т?). Вот для этого и применяется Encapsulate Field:

 string marka;

        public string Marka
        {
            get { return marka; }
            set { marka = value; }
        }

Набрав только string marka - get and set sgenerirovalis automaticho =)

Extract Interface - иногда при реализации нескольких классов получается что их структура идентична. Или создав родительский класс возникает желание создать интерфейс, который будет описывать структуру этого класс. В этом и поможет Extract Interface. Рассмотрим класс Car:

class Car
    {
        int speed;
        string c;
        public virtual void setColor(String color)
        {
            c = color;
            Console.WriteLine(color);
        }

        public int Speed
        {
            set
            {
                speed = value;
            }
            get
            {
                return speed;
            }
        }
    }

Если необходимо создать интерфейс на основе этого класса, то выдели весь класс и нажми Extract Interface. В итоге рефрактор создаст для тебя отдельный файл ICar.cs в котором будет описываться структура Car:

using System;
namespace ConsoleApplication1
{
    interface ICar1
    {
        void setColor(string color);
        int Speed { get; set; }
    }
}

А наш базовый Car перепишется на:

class Car : ConsoleApplication1.ICar1
    {
        int speed;
        string c;
        public virtual void setColor(String color)
        {
            c = color;
            Console.WriteLine(color);
        }
                      ….
    }

Promote Local Variable to Parameter - присваивает локальную переменную параметру. Есть метод Адд():

public int Add(int i, int j)
        {
            int k = 0;
            k = i + j;
            return k;
        }

От строки int k = 0, можно избавиться выделив ее и нажав Promote Local Variable to Parameter, в итоге получаем более компактный код:

        public int Add(int i, int j, int k)
        {
            k = i + j;
            return k;
        }

Remove Parameters - удаление ненужных параметров. Операция почти обратная по смыслу предыдущей. Так же выделяете метод и в вспомогательном окне удаляете все ненужное.

Reorder Parameters - переопределение параметров, то есть А становится В, а B становится A - “обмен местами”.

В итоге: рефракторинг кода как таковой имеет несколько другой смысл - читай “Рефракторинг” Фаулера или “Совершенный код” Макконнела . А все эти фичи от VS направлены больше на повышение удобочитаемости кода и облечение труда кодера.

По материалам: http://www.devx.com/

…а музыка была: Тату - Sacrifice

Blogus tags : ,,

Tags:

Posted in .NET. No Comments »

Создаем простейший инсталлятор с помощью Inno Setup…

Помнится делая TimeIsMoney, обещал я создать инсталлятор под нее. И вот подвернулась мне программка Inno Setup version 5.1.11. Инна очень компактная и удобная программка. Если Вы пользовались NSIS-ом, то сразу же овладете Inno, так как способ написания инсталляторов у этих программ схож. Что ж, не мудрствуя лукава, написал я простейший инсталлтор, используя очень подробный хелп:

 

[Setup]AppName

=TimeIsMoneyAppVerName

=TimeIsMoney version 1.0DefaultDirName

={pf}TimeIsMoneyDefaultGroupName

=TimeIsMoneyUninstallDisplayIcon

={app}TimeIsMoney.exeOutputDir

=userdocs:Inno Setup Examples Output[Files]Source:

TimeIsMoney.exe; DestDir: {app}Source:

options.ini; DestDir: {app}Source:

icolamp.ico; DestDir: {app}ico;Source:

icostar.ico; DestDir: {app}ico;[Icons]

Name:

{group}TimeIsMoney; Filename: {app}TimeIsMoney.exe

Скачать инсталлятор для TimeIsMoney

Это самый простейший инсталлятор, который не лезет в реестр и не отображается в списке Add\Remove Programs, хотя Инночка имеет такие возможности. Но NSIS, как мне видится по-мощнее будет. Об NSISе и как создавать инсталляторы в VS2005 мы еще поговорим…

Так что, пишите программы, чтобы создавать инсталляторы! smile_regular

…а музыка была: Moby - Slipping Away

Tags:

Blogus tags :

Form Lifetime in C#…

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

Все события и их последовательность представлены на следующем рисунке.

formlife
Рассмотрим каждое событие по подробнее:

Создание формы

Создание формы происходит с помощью вызова метода InitializeComponent(), описанного в Form1.Designer.cs, после того как в главной программе мы создали новый экземпляр класса Form: Application.Run(new Form1()). При этом в методе InitializeComponent() не рекомендуется что-либо изменять, поскольку можно потерять “всё что должно построиться”. При этом следующий код тоже возможен:

 

public Form1() {

   InitializeComponent();
// Добавим кнопку

   Button myButton = new Button();

   this.Controls.Add(myButton);
// Изменим имя формы на текущее время

   this.Text = DateTime.Now.ToString();

}

Непосредственно после первого вызова метода Form.Show() или Form.ShowDialog(), наступает событие Load, которое генерируется один раз.

 

// Form1.cs

partial class Form1 : Form {

  …

  void Form1_Load(object sender, EventArgs e) {

    MessageBox.Show(Loading Form1!);

  }

}
// Form1.Designer.cs

partial class Form1 {

  …

  void InitializeComponent() {

    …

    this.Load += this.Form1_Load;

    …

  }

Это событие можно использовать для первоначальной инициализации переменных и для подготовки формы к работе. Сколько в приложении форм, столько раз будет генерироваться это событие. Назначение максимальных и минимальных размеров формы – для этого более подходящего места, нежели обработчик события OnLoad не найти.

Далее следует событие Activated, которое многократно генерируется в течение жизни формы. Связано с получением и потерей фокуса. Методы Form.Show(), Form.ShowDialog(), Form.Activate() (передача фокуса, реализованная программно!) способствуют этому:

 

// Form1.cs

partial class Form1 : Form {

  …

  void Form1_Shown(object sender, EventArgs e) {

      this.label1.Text = Form1 activated!;

  }

}
// Form1.Designer.cs

partial class Form1 {

  …

  void InitializeComponent() {

    …

    this.Shown += this.Form1_Shown;

    …

  }

}

Активация и деактивация

Если в предыдущем примере мы обрабатывали событие происходящие при “фокусировке” формы, то для обратного события существует Deactivate:

 

private void Form1_Deactivate(object sender, EventArgs e)

        {

            this.label1.Text = Form1 deactivated!;

        }

Так же существует метод Hide(), скрывающий форму. Но на самом деле он просто устанавливает Visible в фолз:

 

void hideButton_Click(object sender, EventArgs e) {

  this.Hide(); // Set Visible property indirectly

  this.Visible = false; // Set Visible property directly

}

Уничтожение формы

После использования приложения пользователь закрывает окно. Это может происходить несколькими способами:

 

void Form1_FormClosing(object sender, FormClosingEventArgs e) {

  DialogResult result = MessageBox.Show(

    Abort your app?, App In Progress, MessageBoxButtons.YesNo);

  e.Cancel = (result == DialogResult.No);

}

Или:

 

void Form1_FormClosed(object sender, FormClosedEventArgs e) {

  MessageBox.Show(Your  was aborted);

}

Closing наступает непосредственно перед закрытием формы. В этот момент процесс закрытия формы может быть приостановлен и вообще отменён, чему способствует размещаемый в теле обработчика события следующий программный код: e.Cancel = (result == DialogResult.No)
Closed происходит после закрытия формы. Назад пути нет. В обработчике этого события размещается любой код для “очистки” (освобождения ресурсов) после закрытия формы.

Для обработки всех путей закрытия формы можно создать перечисление:

 

enum CloseReason {

   None, // No reason given, or could not be determined

   WindowsShutDown, // Windows is closing (ShutDown or Logoff)

   MdiFormClosing, // MDI parent form is closing

   UserClosing, // User closed (close box or Alt+F4)

   TaskManagerClosing, // Task Manager | End Task

   FormOwnerClosing, // Owner form is closing

   ApplicationExitCall // Application.Exit invoked

}

И использовать его:

 

void Form1_FormClosed(object sender, FormClosedEventArgs e) {

  MessageBox.Show(

    Your game was aborted:  + e.CloseReason.ToString());

}

…а музыка была: Jennifer Lopez - If You Had My Love

Tags:

Blogus tags : ,

ГАИшники…=)

Давно я не ударялся, поэтому и не было экспериментального юмора. А тут увидел гаишников в машине и вот:

Два часа теплой, весенней ночи. После дежурства, уставшие и довольные, они ехали по ночному городу. Дорога была свободной. Из ночных клубов доносились ритмы RnB, а неон от вывесок ярко подсвечивал синие полосы на дверях новенькой девятки. На заднем сиденье валялись разорванные штрафы, а козырек с трудом поддерживал уже оплаченные квитки с изображениями Ярослава Мудрого, Петра I и Джорджа Вашингтона. Ехали молча. Сидоров устало смотрел на дорогу и мечтал поскорее оказаться в кровати.
(громкий оглушающий звук милицейского свистка)
— Петров, ты че сдурел…!!!
(громкий оглушающий звук милицейского свистка)
Петров, сидящий рядом, взял в руки патрульный жезл и показал характерный жест, означающий просьбу припарковаться на обочину. Сидоров, обалдевший от действий напарника, сбавил скорость и вскоре встал у обочины. Петров быстро вышел из машины, обошел и представился через открытое окно:
— Старший лейтенант Петров, предъявите документы!
— А в чем собственно дело?
— Вы превысили скорость. Ехали 100 км\ч, а у нас ограничение 60. Ваши права?
— Петров, че с тобой, Петров это Я — Сидоров, ты че Коль устал что ли?
— Ваши права?
— Ты че Колян!
— Ваши права?
— Ну, мудак…
Сидоров достал права и вышел из машины.
— Пройдемте в машину — оформим штраф — сказал четко Петров, посмотрев на права.
Петров вновь обошел машину и сел на свое место. Сидоров провел его взглядом и тоже уселся на место водителя той же девятки.
— Так фамилия, год рождения….
— Командир может договоримся за 500… — удивленно для себя сказал Сидоров.
— паспортные данные, прописка, тех.талон…
— лано понял, штука…
— Ну что ж, я не буду Вас лишний раз тревожить гражданин Сидоров и закрою глаза на Ваше правонарушение… — сказал Петров, на что Сидоров достал из козырька квиток с Ярославом Мудрым и передал коллеге.
Петров опять вышел из машины, обошел и передал Сидорову права со словами: «Удачного пути!».
Коля вновь вернулся на свое привычное место и со словами: «Дай пять!», ударил Сидорова по плечу, делая вид что промахнулся мимо выставленной ладони Сидорова.
— Еще штучка… — довольно сказал Петров и засунул под козырек над собой.
«Чмо» — подумал Сидоров, заводя машину.
«Слушай, я тут сканворд недоотгадывал — по вертикали из 3-х букв — Оскорбительное название человека» — произнес Петров.

ЗЫ: значения слов — козерек, девятка и патрульный жезл подсказал Леха aka Hunter =). прикольная миниатюра бы вышла…

PS: Дорогие читатели и читательницы heart! Респект! Вопщем задали мне по экономике в инсте написать реферат на тему: «Рынок: возникновение и эволюция» Так вот, если кто чем поможет, кто делал, кто собирал наподобии, киньте плиз на почту brat-line_собака_yandex.ru. С меня какой-нить приз будет=))) После 30 апреля это чудо-предложение сгорает! Спешите! smile_wink

ЗЗЫ: нормальную объяву кинул, да? smile_teeth

…а музыка была: Чичерина - 40000 км

Tags:

Blogus tags : ,