Patterns2015
.pdf6. |
Коддолженбытьудобочитаемым |
. |
|
|
|
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