Книга е още в много ранна фаза на написване



страница15/73
Дата25.07.2016
Размер13.53 Mb.
#6732
1   ...   11   12   13   14   15   16   17   18   ...   73

Анализ и проектиране


Парадигмата на обектно-ориентираното програмиране е нов начин на мислене за програмирането и много хора отначало се затрудняват как да подходят към про­ек­тите си. Сега като знаете че всичко се предполага да бъде обекти вие мо­же­­те да създадете “добър” дизайн, такъв който ще донесе всички предимства кои­то се предполага да дава ООП.

Повечето от книгите посветени на ООП са пълни с дълги думи, тромава проза и важ­но звучащи декларации.9 Аз не споделям този начин мислейки че книгата би била по-добра като глава или най-много като много кратка книга и драз­ней­ки се от схващането че този процес не може да се опише стегнато и директно. (Смущава ме, че хората, които претендират да управляват сложността се за­труд­няват да напишат проста книга.) Най-после, цялата работа с ООП е да се на­прави процесът на софтуерна разработка по-лесен и макар това да заплашва мо­же би поминъка на хората, които консултират по въпросите на сложността, за­що все пак нещата да не се направят по-прости? Така, надявайки се да съм възбу­дил здравословен скептицизъм у вас аз ще се стремя да ви предам моето виж­дане относно анализа и проектирането в колкото е възможно по-малко пара­графи.


Стоим на курса


По време на процеса на разработка най-важното е: не се загубвай. Лесно е да се направи. Повечето от тези методологии са направени да решават най-големите про­блеми. (Това има смисъл; тези са наистина много трудни проблеми които оправ­дават наемането на съответния автор като консултант и съответните му го­леми цени.) Запомнете че повечето проекти не попадат в тази категория, така че можете да имате успешен анализ и проектиране с малко подмножество от ця­лата методология в повечето случаи. Но винаги някакъв анализ и про­ек­ти­ра­не биха ви довели по-бързо до искания резултат, отколкото просто да седнете и да започнете да програмирате.

Ще рече, че ако вземете методология, която има огромно количество детайли и изиск­ва съответното количество документация, трудно е все още да се каже къ­де да спрете. Помнете какво се опитвате да откриете:



  1. Какво са обектите? (Как разделяте проекта си на части?)

  2. Какви са техните интерфейси? (Какви съобщения трябва да можете да изпращате на всеки обект?)

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

Процесът може да се проведе на четири фази и фаза 0 е просто да се реши пър­во­начално каква ще бъде общата структура.


Фаза 0: Да направим план


Първата стъпка е да решите какви стъпки ще има във вашия процес. Звучи про­сто (фактически всичко това звучи просто) и ето, често, хората даже не оби­ка­лят до фаза едно преди да започнат писането на програмите. Ако вашият план е “да скочим и да почнем кодирането,” чудесно. (Понякога така е добре - когато има­те добре разбран проблем.) Най-малкото съгласен съм, че това е план.

Бихте могли да решите също, че някаква допълнителна структурираност на про­екта е необходима, но не прекалено велика. По достатъчно разбираеми при­чи­ни някои програмисти предпочита да работят в режим на “ваканция” където не се предполага никаква структура на процеса на тяхната работа: “Ще стане ко­гато стане.” Това може да бъде провлекателно за малка, но аз съм открил, че на­личието на няколко километрични камъка по пътя помага да се фокусират и ци­ментират усилията по посока на тях, отколкото единствено до целта “завършване на проекта.” В добавка това разбива процеса на по-смилаеми пар­че­та и го прави по-малко заплашителен.

Когато аз започнах да изучавам приказката структура (така че някой ден ще на­пи­ша новела) първоначално се съпротивлявах на идеята, чувствайки че когато пи­ша просто написаното се излива върху страниците от само себе си. Това, кое­то открих бе, че когато пиша за компютри структурата е сравнително проста и не изисква специално внимание, но аз все пак структурирах моята работа все пак, само полусъзнателно в моята глава. Така че даже и да мисбите, че плана ви е веднага да започнете кодирането, все пак минавате следващите фази зада­вай­ки си някои въпроси и отговаряйки им.

Фаза 1: Какво ще произвеждаме?


В предишното поколение програмно проектиране (процедурното проектиране), то­ва би било наречено “създаване на анализ на изискванията и спецификация на системата.” Това, разбира се, бяха местата, където да се загубиш: за­пла­ши­тел­но наименовани документи които са способни да вземат голям проект в своя соб­ственост. Те бяха писани с добри намерения, обаче. Анализът на изискванията казва “Направи списък на правилата, по които ще се водим за да свър­шим работата и задоволим потребителя.” Системната спецификация казва “Ето описанието какво програмата ще прави (не как) за да се задоволят изиск­ва­нията.” Анализът на изискванията е в действителност договор между вас и по­требителя (даже и потребителят да работи във вашата компания той е друг обект в системата). Системната спецификация е изследване на връхното ниво на проблема и в някакъв смисъл откриване как проектът да се направи и за кол­ко време. Доколкото и за двете ще е необходим консенсус в персонала, мисля, че е добре да се държат колкото се може по-прости – в идеалния случай като спи­съци и диаграми – за да се спести време. Може да има и други изисквания, кои­то да ви накарат да ги разпрострете в по-големи документи.

Необходимо е фокусът да остане върху това, което искате да направите в тази фа­за: да определите какво ще се иска от системата да прави. Най-ценното в тази по­сока е колекция от т.н. “случаи на използване.” Това са основно описателни отго­вори на въпроси които почват с “Какво прави системата ако …” Например “Какво прави автоматичния (програмен -б.пр.) отговарящ ако клиентът е на­пра­вил депозит в рамките на 24 и няма достатъчно пари в сметката за да му се из­плати подаден чек?” Случаят на използване описва подробно какво ще се пра­ви по-нататък.

Опитвате се да откриете пълната система на случаи на използване на про­гра­ма­та и когато веднъж го постигнете сте се сдобили със сърцевината на това, което си­стемата (целевата -б.пр.) се предполага, че ще прави. Хубавото на събирането на случаите е, че те винаги ви връщат към основните неща и ви предпазват от откло­нения към неща, които не са критично важни. Тоест ако имате пълната си­сте­ма случаи вие можете да опишити вашата система и да преминете към след­ва­щата фаза. Вероятно няма да я получите перфекто очертана в тази фаза, но то­ва е нормално. Всичко ще се разбули от самосебе си с течение на процеса на раз­работка и ако вие искате перфектно описание още на този етап ще се си от­во­­­рите излишна работа.

Както крачния стартер на мотоциклет помага в тази фаза, ако изложите нещата в няколко параграфа и проследите за глаголи и съществителни . Съ­ще­стви­тел­ни­те стават обекти и глаголите - методи в интерфейсите на тези обекти. Ще бъ­де­те изненадани колко полезен инструмент може да бъде това; понякога то ще свър­ши лъвската част от работата вместо вас.

Въпреки че едва започваме, в тази точка някакво разпределение на времето ве­че е полезно. Вече имате поглед върху това, което се строи така че вероятно ще мо­же да направите оценка колко дълго ще продължи. Много фактори важат ту­ка: ако изчислите дълго време за реализация компанията може да не приеме про­екта или управителят може вече да е решил колко време ще трае и да ви се намеси в разписанието. Но най-добре е да си направите честно разписанието и да вземете трудните решения рано. Много опити е имало да се излезе с аку­рат­ни разчети на времето (подобни на техниките на предвиждане на борсовия па­зар), но може би е най-добре да се осланяте на опита и интуицията си. След ка­то сте направили оценка, която смятате за добраудвоете я и добавете 10%. Ва­ше­то чувство вероятно е точно; вие можете да получите нещо работещо за то­ва време. “Удвояването” ще го направи прилично и десетте процента ще са за до­изкусуряване и детайли на края. Обаче вие искате да го обясните и не­за­ви­си­мо от стоновете и манипулациите които ще се чуват, всичко ще стане за това вре­ме.

Фаза 2: Как ще го направим?


На края на тази фаза трябва да имате проект от който да личи как ще изглеждат обек­тите и как ще взаимодействат помежду си. Удобен продукт с дияграми е Unified Modeling Language (UML). Може да вземете спецификация за UML от www.rational.com . UML може да бъде също полезен като инструмент за опи­са­ние по време на фаза 1 и някои от диаграмите които сте съставили там вероятно ще продължат модифицирани във фаза 2. Не е необходимо да използвате UML, но това може да бъде полезно, особено ако възнамерявате да окачите диаграми по стените за обсъждане от всички, което е добра идея. Алтернатива на UML е текс­тово описание на обектите и техните интерфейси (както описах в Thinking in C++), но това може да бъде ограничаващо.

Най-успешното консултиране което съм давал беше на тим, който никога преди това не беше правил ООП проект, като рисувах обекти на черната дъска. Об­съж­дах­ме как обектите ще взаимодействат помежду си, триехме някои и рисувахме но­ви. Тимът (те знаеха какво се очаква да прави проектът) фактически създаде ди­зайна; те “притежаваха” дизайна наместо той да им е спуснат отвън. Всич­ко­то което аз правех беше да водя процеса чрез задаване на точните въпроси, пра­вех предположения и имах обратната връзка с тима за корекцията им. Кра­со­тата на процеса беше в това, че тимът се научи да проектира ОО не с раз­глеж­дане на абстрактни примери, а чрез работа над проект, който беше най-­инте­ресният за тях към него момент: техния.

Ще знаете че сте свършили фаза 2 когато имате описанието на обектите и тех­ни­те интерфейси. Е, повечето от тях – има по няколко, които се промъкват и ста­ват ясни във фаза 3. But that’s OK. Трябва да откриете всички ваши обекти в края на краищата - това само ви засяга. Добре е да ги откриете рано, но ООП да­ва достатъчна база да ги включите и по-късно, ако ги откриете тогава.

Фаза 3: Да строим!


Ако четете тази книга вероатно сте програмисти, така че сега сме вече в частта, до която искате да стигнете. Чрез следване на план – без значение колко прост и кратък – и построяване на структурата на проекта преди кодирането ще от­крие­­те че двете неща се постигат заедно по-лесно, отколкото ако се гмурнете вед­нага в програмирането, и това дава голямо удовлетворение. Въз­на­граж­да­ва­що е да имаш желания код, който прави точно каквото се иска от него, даже ка­то от дрога, както става при определено излизащо от употреба поведение на ня­кои програмисти. Моята практика обаче показва, че удовлетворението от еле­гант­но решен праблем доставя удоволствие от съвсем друго ниво; то по-при­ли­ча на изкуство, отколкото на технология. И елегантността винаги се изплаща; тя не е лекомислено преследвана. Не само че дава програма, която е по-лесно да се построи и изтества, но също е по-лесна за управление и разбиране и имен­но от там идва финансовата ценност.

След като построите (компилирате и свържете - б.пр.) системата, важно е да се на­прави реалистичен тест и тук е мястото където системния анализ и спе­ци­фи­ка­ция влизат в работата пак. Минете по цялата програма и проверете дали всич­ко е наред и работи както се обаква по списъка на случаите. Сега сте готови. Да­ли сте готови?


Фаза 4: Итерация


Това е моментът в цикъла на програмното осигуряване, който традиционно се на­рича “поддръжка,” термин с всевъзможни значения който може да значи от “да се накара да върви по начина, който отначало се искаше от него” до “до­ба­вя­не на черти, които потребителят забравил да спомене по-рано” и до по-тра­ди­ци­онното “оправяне на грешки, които забавят” и “добавяне на нови черти как­то изискват появяващи се нужди.” Толкова много смесени концепции са при­ла­га­ни към термина “поддръжка” че той се взема малко за развалящ качеството, ча­стично защото казва че сте направили завършена програма и че всичко, което тряб­ва да правите е да сменяте части, да я смазвате и да я пазите от ръжда. Мо­же би има по-добър термин за описание на това, което става.

Терминът е итерация. Тоест: “Не можахте да го направите точно от първия път, затова се върнете и си дайте труда да го проучите и подобрите.” Може да се наложат много промени като навлизате по-дълбоко в проблема. Еле­гант­ност­та, която постигате при това ще се изплаща и в краткосрочен, и в дългосрочен план при това.

Какво значи “да се оправи” е - точно каквото програмата не прави точно спо­ред изискванията. Значи също, че вътрешната структура на програмата да има сми­съл за вас и да създава чувството че всичко се сработва добре, без тромав син­таксис, прекалено големи обекти и несръчно изложени на показ парченца код. В добавка трябва да чувствате, че структурата ще оцелее след всички про­ме­ни, които несъмнено ще има през време на живота на програмата, а и че та­ки­ва промени ще стават лесно и евтино. Това не е малко постижение. Трябва не са­мо да разбирате построеното от вас, но също и как програмата ще се развива (кое­то аз наричам вектор на промяната). За щастие ООП езици са специално при­годни за този тип непрекъснати промени – границите създадени от обектите са това, което има тенденция да пази системата от сриване. Те също позволяват да правите промени, които изглеждат драстични при процедурното про­гра­ми­ра­не без да предизвиквате земетресение. Фактически поддръжката на ите­ра­ция­та може би е на-печелившата част от ООП.

С итерацията може най-малкото да постигнете някакво приближение на же­ла­ното, след това спирате, сравнявате го с изискванията и набелязвате нови про­ме­ни. После се връщате обратно и оправяте нещата с използване на парчета код.10 Може да имате в действителност да решавате проблем, или аспект на про­блема, няколко пъти преди да ударите правилното решение. (Изучаването на Design Patterns, описани в глава 16 обикновено е полезно в това отношение.)

Също е итерация, когато построите система, видите че удовлетворява изиск­ва­ния­та и после откриете, че те не са били подходящи. Когато видите системата забе­лязвате, че сте искали да решите друг проблем. Ако смятате, че този вид ите­рация е на път да се сбъдне, ще гледате да направите първата версия кол­ко­то може по-набързо за изясняване след това какво всъщност се иска.

Итерацията е близка до инкрементното разработване. Инкрементно раз­ра­бот­ва­не е когато започнете с най-централната част на вашата система и после я из­полз­вате за среда за развитие, в която се разработва кодът парченце по парченце. После започвате да добавяте черти по цяла една наведнъж. Трикът е да се проектира среда, която лесно да получи всички черти, които ще искате по­сле. (Вж. глава 16 за по-вътрешно разглеждане на това.) Предимството е, че когато веднъж подкарате началната система, всяка нова черта изглежда като ма­лък проект, а не като част от голям проект. Също е и по-лесно да се про­веж­да поддръжката. ООП поддържа инкременталното разработване, понеже ако про­грамата ви е разработена добре, промените ще са нови обекти или групи обек­ти.


Планирането се изплаща


Не може да се построи къща без множество грижливо начертани планове. Ако строи­те кучешка колибка вашите планове вероятно няма да са толкова по­дроб­ни на сигурно ще започнете с нещо като скици, които да ви водят в работата. Соф­туерната разработка е отишла към крайности. Дълго време хората нямаха струк­тура на разработките си, но тогава големите проекти започнаха да се провалят. Като реакция се появиха методологии със сплашващо количество правила и данни. Те пък бяха тежки за използване - изглеждаше, че цялото вре­ме трябва да отиде за писане на документация, а не за програмиране. (Често та­къв именно беше случаят.) Надявам се, че това което съм казал тука сочи сред­ния път – една подвижна скала. Използвайте подход който отговаря на нуждите (и индивидуалността) ви. Без значение колко минимален, някакъв ще донесе го­ля­мо предимство пред липсата на всякакъв план. Помнете че според някой оцен­ки повече от 50% от проектите се провалят.



Сподели с приятели:
1   ...   11   12   13   14   15   16   17   18   ...   73




©obuch.info 2024
отнасят до администрацията

    Начална страница