Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Patterns2015

.pdf
Скачиваний:
10
Добавлен:
14.02.2015
Размер:
42.45 Mб
Скачать

6.

Коддолженбытьудобочитаемым

.

 

 

7.

Наименованияк

лассов,полей,методов,параметро

 

вдолжныбытьговорящими« »,т.е.

 

 

ихименадолжныпонятноговорить,чтозачтоотвечает.Коддолженописыватьсебя.

 

 

 

8.

Недопустимоисполькраткиенезначащиеоватьничегоназвания(

 

a, z1,

class1).

 

Краткиеназванияпеременны

хдопустимоиспольз

оватьтолькодляиндеци.кслов

 

9.

Недолжнобытьдублированиякода

.

 

 

10.

Недолжнобытьдублированиякодаснебольшимиизменен.Ведьможноями

 

 

 

 

использоватьфункции,методы,наследование,параметризацию

 

.д.

 

11.

Классынедолжныбслишкомтьсил

 

ьносвязанысм(.низкуюсвязанность3.2)

.

12.

Недолжныиспользмагическиеонсва.Дажертьсязработчикнтычерезмесяцне

 

 

 

 

сможетвспомн,чтозначит44,ть536

 

 

.д.вкоде.Константыследуетобъявлятьи

 

 

называть.

 

 

 

 

13.

Недолжныиспог ьзоватьсяобальныеперем

 

енныеможет(быть,исключая

 

 

испокльзованияассов

-одиночек,см. 5.5)

 

.

 

14.Метнедобытьлжныдысильнобольшогоразмера.Есликодметодаслишком большой,егоцелесообразноподелитьнанесколькоболеекороткихприватных методов.

15.

Поклассаивнутренниеяметоды

должныиметьправильныемодификаторыдоступа

.

16.

Классынедолжныбслишкомтьраздутысм(.высокоезацепление3.2)

 

 

.

17.

Реализацияметдобытьлжнадовэффективнойиспользовастандартныеь

 

 

 

 

структурыданных.Например,дляколлеобъектов, оторуюциичавс

 

 

тавляются

 

иизкоторойчастоудаляют,нследуетныеи япользомасси,эффективнееатьы

 

 

 

 

приэтомспользспис, оватьк

очередьит.

.

 

18.

Пов зм,доиспользоватьсялжныстиразработанныепринятыесообщ ством

 

 

 

 

сторонниекомпоненты.Неследуетписавелоь

 

сипедвомногихслучаях

.

19.

Должнабытьдокументациякодудиаграммы( классов,спец,диаграммыфикация

 

 

,

 

поясняющиеработусистемыалгоритмов

 

,текстоваядокументация)

.

20.КодС++неолжениспользмакрСпововатьсызможности,неиспользовать стандартнуюб иблиотекуС .

21.

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

RTTI (динамическое определениетипа)

.

22.

Нерекомендуетсяиспользовамножественноенаследованиеь

.

 

23.Графическийинтерфейсдолженбыотделеньметодов,реализующихогику системы.

11

24.

Недолжныиспользоватьсясгенериров

анныеметодыиназванияобъектоввроде(

 

 

button1, button1_onclick()).

 

 

25.

Операцииввода

-выводадолжныбыотделеныьлогики

 

.

26.

Субъективная оцекодан( ркавится

-ненра,звезд5,итсязвезды3

.д.).

2.2Примеранализастуденческогокодадругимистудентами

1.Используютсянеинформативим наремен; ныхе

class Bus : public Truck

{

int xStop; int yStop; int TimeStop; bool isStop;

Car::Car(int s,int l,int dx,int dy,int ml):Vehicle(s,l,dx,dy)

{

setMaxLength(ml);

}

2. Применяюнепонятныеся

константы;

void SUV::setSpeed(int s)

{

(isRoad) ? Vehicle::setSpeed(s) : Vehicle::setSpeed(5);

}

void SUV::setLength(int l)

{

(l > 0 ) ? Vehicle::setLength(l) : Vehicle::setLength(45);

}

3.Присутствуютнеинформимеcontrol’овформеа;тивные

private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {

this->Close();

}

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

button1->Enabled = false; TimerNewVehicle->Enabled = false; TimerVehicleGo->Enabled = false; StartRoad->Enabled = true; TimerSort->Enabled = false; Show();

}

12

4.Создансобыйфайл GlobalVars.h.Посути,егодермоспокойножимое

распределитьмеждустандартным

stdafx.h иполямиформы

Form1.h;

#pragma once #include <vector> using namespace std;

vector<Vehicle*> road; vector<SUV*> outRoad; int LenRoad;

int MaxSpeed;

5.Неопструктураимальнаяоператоif/elseснагроскобвмождениемсл жнымик услов.Кпр,нижеямимеруобавложенныхсл впадаютвовсёмия,кромезнака. Ихможвывндвепоестиременныетипаintилиdoubleпроверятьужеих.Также явнопр сит сяelseбезлишнихскобокмеждуif ;

if(radioButton4->Checked)

{

if((data[j]->getX() + data[j]->getLength())/2 > (data[j+1]- >getX() + data[j]->getLength())/2 )

{

Vehicle* tmp = data[j]; data[j] = data[j+1]; data[j+1] = tmp;

}

}

else

{

if((data[j]->getX() + (data[j]->getLength()/2)) < (data[j+1]- >getX() + (data[j]->getLength())/2) )

{

Vehicle* tmp = data[j]; data[j] = data[j+1]; data[j+1] = tmp;

}

}

6.Странныйспособисп льзованияпер атораswitchКавычкиможноубратьбез. ущерба работоспособности,темсамымулучшивчитаемость;

switch(type)

{

case 0:

{

Car* car = new Car(s,l,x,y,30); road.push_back(car);

}break;

case 1:

{

Truck* truck = new Truck(s,l,x,y,70); road.push_back(truck);

}break;

13

case 2:

{

if ( l < 65 ) l = 65;

Bus* bus = new Bus(s,l,x,y,70,400,y); road.push_back(bus);

}break;

case 3:

{

Taxi* taxi = new Taxi(s,l,x,y,30,xs,y); road.push_back(taxi);

}break; case 4:

{

SUV* suv = new SUV(s,l,x,y);

Truck* truck = dynamic_cast<Truck*>(suv); road.push_back(truck);

}break;

}

7.Множестнаследованклассоввпосл, енноеприкдствиитрудноводящее

отслеживаемымпроблемам;

#pragma once #include "Truck.h" #include "Car.h" #include "Vehicle.h"

class SUV : virtual public Truck , public Car

{

int isRoad;// 0 - наобочине, 1

- над ороге.

8.Прикаждомвызовеметодапрорисовкиемувсегдапередссылканодинётсятот жеобъект.Логичнейбылоосуществперевсегоодразачуиконструкторе(ть илиsetter’ом,предварительнообъявивклассессылкунаобъект);

virtual void draw(Graphics^ g , bool cmd);

9.Отсутствуютпробезапятыхпос;ле

bool isStop; public:

Taxi(void);

Taxi(int s,int l,int x,int y,int ml,int xs,int ys);

//

//get

10.Сущнесразкотвуютсоглашенийькоичныхобименовапеременных,одв ииако данномслучаевовсенепо,какоеизнсоблюдаетсяятноих;

int xStop;

14

int yStop; int TimeStop; bool isStop; bool isStop;

public: Taxi(void);

Taxi(int s,int l,int x,int y,int ml,int xs,int ys);

//

//get

//

virtual int getSX(void); virtual int getSY(void); virtual int getTimeStop(void);

11.Перендлиннстроксытсутствуют,приходииспользоватьпрокрутку;ся

12.Кла,посутисывоей,представляютсобойлишьнаборgettовиsовe,логикаtter’в нихпрактически нереализуется;

class Taxi : public Car

{

int xStop; int yStop; int TimeStop; bool isStop;

public: Taxi(void);

Taxi(int s,int l,int x,int y,int ml,int xs,int ys);

//

//get

//

virtual int getSX(void); virtual int getSY(void); virtual int getTimeStop(void); virtual bool getIsStop(void);

//

//set

//

virtual void setTimeStop(int ts); virtual void setIsStop(bool is);

//

//interface

//

virtual void draw(Graphics^ g,bool cmd); ~Taxi(void);

};

13.Всялогифакртическиасполвнутфор; женамыи

15

private: System::Void TimerNewVehicle_Tick(System::Object^ sender, System::EventArgs^ e) {

Random^ rand = gcnew Random(); int x = -10;

int y = 10;

int s = rand->Next(40,MaxSpeed); int l = rand->Next(50,80);

int type = rand->Next(0,5); int xs = rand->Next(250,800);

switch(type)

{

<Здесьбылкодswitch’а>

}

}

14.Низкаякомментировакода,текомментарии,чтоимеются, ность малоинф.Примерыковышедармативныэтонагляднодемонстрируют.

2Заданияк.3

разделу 2

 

 

 

 

1.

Дляработынеобходиморазделитсяна

команды,

ипослать

их список преподавателю.

2.

Командадолжнавыбратькодпрежнегоготовогопроектанапример(,курсовой

 

 

 

 

рабпООПо)инарисовты диаграммуклдляэтогосстьк вда

 

 

 

.

3.

Далеенеобходимозакачать

проекта командыидиаграммуклассовнаобщий

 

 

репозиторий (адресузнатьпреподавателя)

. Какэтоделается?

Примердлясистемы

 

контроля версийGit

:

 

 

 

 

• СкачатьконсольныйGit

(например,

 

https://msysgit.googlecode.com/files/Git-

 

1.8.3-preview20130601.exe).

 

 

 

 

• Пост,ук,чтобыавизаонбылтьвпутях

 

 

ОС.Этоп зво

литвводитькоманды

 

команднойстрокеfarилиcmd

.

 

 

 

Склонироватьсеберепозитпреп( д рийсоздатьдавательлжнпозиторийна

хостингевродеgithubпользова,котможписатьрыйеуда)ля

 

 

 

.

 

• Создатькакую

-либопапку

, зайти внееитамвкоманднойстрок

 

е написать

 

git clone http://<пользователь>@<репозиторий>

 

 

 

(д оступпопротоколуhttp,чтобыне

 

имдетьло

сключами,по

-хорошемунадопо

 

защищенномуканалудляэтого(нужноиспкл,которыеючиьзовать

 

 

 

 

 

генерируютсявпрофилепользователя))

 

.

 

 

 

• Послетого,как

данныезакачаютсяналокальныйкомпьютер

 

 

,врепозитории

необходимосоздатьпап(ркусоздаетсясто

 

 

там средстваОСипотоми

 

добавляется git):

 

 

 

 

 

git add <папка>

 

 

 

 

 

здесь <папка> - имя папки, необходимозадать

3фамилии латиницейподряд

.

Есливсеок,то

необходимоскопировать

тудакодидиаграммуклассов

.

 

И добавить в git: git add <папка>/*

16

(надобытьуровеньвышедляэтогопримера)

.

 

• Последобавлвсехфайловнеобния

ходимосделатьлокальныйкоммит

:

git commit -a -m "message"

 

 

гдеmessage - сообщение,том,

что сделано вкомм,будетвиднологахте.

 

Таккак git системараспре,надопосвсеизменениянаялатьсервер.

Пользовательдолженбытьсправаминазапись

 

,поэтому следуетнаписать

:

git push

 

 

 

и ввести пароль пользователя

 

 

 

• Вдальнейшем , изменениядруг

ихможноподхватить

ксебе ,набравкоманду

 

git pull

 

 

 

впапкеподсистемойgit.

 

 

 

4.

Дожкодаи атьсяиаготдркомандугихамм

 

.

5.

Результатыанализакода

запивфайлсоатьвоими

фамилиями (doc, pdf) впапке

 

чужогокодаидобавитьегорепозиторий

 

согласно описанному алгоритму.

17

3Базовыешаблоныпроектирования

 

 

 

 

 

Навашуерняказадилиеечуктолог

 

 

-токогда -торешал.

Необходимоиспользовать

опытдругихразработчиков.

 

Дажеесливыотличноспроектсвоеи,солрожениевали

 

 

временонод лжное,инятьсям

 

 

начеоноумрет.Вносимыеизменениядолжныоказ вать

 

 

минимвлияниесуществующийальнк.од

 

 

 

 

 

Впрограмминженерии,начинаяск ойиг

 

 

“Бандычет рех

”быловведенопонятие

паттернов

(или

шаблонов)проектирования,которыесталиогомгоритмов

 

при

кодировании,но применительнок

сферепроектированияпрограмм,покак, рещатьзывая

 

 

ужеизвестныезадачипроектировпрограммныхсистеманспособадартныия. ми

 

 

 

 

Длярешения

таких проблем были разработаны паттерныпроектирования

:

1.

Опобъеквещатьонас ыупле

 

 

ниисобытий,причемобъектыгуттказатьсяв

 

 

 

дальнейшемоттакогооповещения.

 

 

 

 

2.

Надесвоичужиелобътьновывозктымиожностя

 

мибезмодификациикодакл сса

 

3.

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

 

 

 

.

4.

Заставитьобъектыимитир

оватьинтерфейс,которымиобладают

 

 

 

итакдалее.

 

 

 

 

 

 

3.1 Чтотакое

GoF и GRASP

 

«Бандачетырёх

»впрограммировании(

Gang of Four,сокращённо GoF) —

распространённназваниегруппычетырехавтоЭГамма( ихов,Риче Хелм,Ральфрд

 

Джонсон, Влисси

дес),выпустившихкнигу

Design Patterns [1].

GRASP (General Responsibility Assignment Software Patterns — общиепаттерны распределенияобязанностей) – это набор принципов проектирования по версии Крэга Лармана, автора книги “Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development” [4].

Принципы GRASP

Polymorphism (Полиморфизм)

18

Low Coupling (Низкая связность)

High Cohesion (Высокое зацепление)

Protected Variations (Устойчивый к изменениям)

Паттерны,отвеч ающпринципамбудут(ечастичнорассмдалее) трены

Information Expert (Информационныеэксперт)

Creator (Создатель)

Controller (Контроллер)

Pure Fabrication (Чистаявыдумкаилич синтезированиестое)

Indirection (Посредник)

Рассмотримосновпринципыые

GRASP празработкеидизайнасистемы.

 

Polymorphism (Полиморфизм)

 

 

Полиморфизм позволяетобральба вариантыернативыватьповеденияос ые

 

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

 

 

различныхвариантовповеденияс

мощью полиморфныхопераций

дляэтогокласса.

Всеальтернативреализацииприводякобщемунтыеерфейсуся

Low Coupling (Низкаясвязность)

Еслиоб

ъектывприложениисильносвяза

ны,толюбойизменениепркизменениямводит

 

восехвязанныхобъектах.

Аэтонеудоипорождаб.агиВпоэтнонеот,мубходимо

 

 

чтобыкодбылслабосвязанизависелотабстракций.

 

 

 

Например,еслинашкласс

Sale

(прод)реаинтерфейсжилзует

ISale идругиеобъекты

зависятименноот

 

ISale,т.е.отабс,ткогдаракциимы

захотимвнестиизменения

 

касательно Sale – намнужнобудвслишьептгодменреал. изациють

 

 

Программнаосновеабстри(нтерфейсруйте,акцийбстрактныйкласс.п.),не

 

 

 

реализаций

 

 

 

 

High Cohesion (Высокоезацепление)

отнокслабойитсявязанности,

они дутвпареи

одновсегдапривод

 

иткдругому.Классдолжениметь

какую-тооднуответственность

.

Например, Sale (пр)облададажавсемиответственн,которыекасаютспродаж, стями

 

 

например,вычислобщсуммыейние

 

– Total.Нодавайтепредставим

, чтомысов

ершили

оплошностьипривнесли

Sale ещетакуюответственностькак

Payment (пла)Ч. тежо

получится?Получтоодниленыитсякласса,которыекасаются

 

Sale,будутмеждусобой

 

достаточнотесносвяз,и членыкженныкласса,которыеоперируютс

 

Payment,межд у

собойбудуттесносвязаны

. Новцелом

, сцепклассаенность

SaleAndPayment будетнизкой,

ведь посутимыимдесдвумяемлобособлечастямиводномцелом.Ирезонноны и

 

 

 

будетпровестирефакторингразделитькласс

 

SaleAndPayment на Sale и Payment,котор ые

внубудутеснорисвязаны.

 

 

 

 

19

Прогрт,чтобыакммодклассинмелединсруйтезотнуветственности,нную, следовательно,былсильносцепленвнутри.

Protected Variations (Устойчивыйкизменениям)

Какспроектобъекты,чтобизмененияроватьобъек

 

тенезатрагивалидругих?Как

избежатьситуациикогдаприизмененвноситькодабъектапридетсяизменения

 

множедругихобъексиство? темыов

 

 

Мы пришликвыводу

, чтонужноисп льзовать

low coupling.Носутьданногопринципа

немновдру.Сутьвгом

 

м,чтобыопределточки“изменений”зафть ксироватьх

абстракцииинтерфейсе( ).Точкиизменений“ ”

– нечтоиноекакнашиобъекты,которые

могутменяться.

 

 

 

Тоесутьпринципа

- определитьместавсист,гдповмеожетизменитдение

ьсяи

выделитьаб

стракцию,наосновекоторойбудетпроисходитьдальнейшеепрограммирование

 

сиспользэтогообъекта. ванием

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

3.2 Классификацшаблпроектиноврования

Базовые

Порождающие паттерны связаны с созданием экземпляров объектов; все они обеспечивают средства логической изоляции клиента от создаваемых объектов.

Паттерны, принадлежащие к

поведенческой категории, соотносятся к взаимодействиям и распределению обязанностей между классами и объектами.

Структурные паттерны

объединяют классы или объекты в более крупные структуры.

Базовыешаблоны :

Delegation и Delegation Event Model

Interface и Abstract Superclass

20

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]