Need, kes tarkvaraarendusega kokku puutunud, on ilmselt kogenud, et alguses saab rakenduses muudatusi ruttu teha. Mida aeg edasi, seda raskemaks ja aeganõudvamaks see muutub. Kas asjad nii käivadki või on meil viga arhitektuuris? Enamasti on viga programmikoodi ülesehituses. Sama reha otsa astutakse korduvalt, kuni lõpuks saab villand ja sooviks asju paremini teha. Abiks on Uncle Bob poolt välja käidud clean plugin architecture.
Kõigepealt mõtleme, mis on ühes lihtsas rakenduses valesti ühe näite abil. Keskendume eelkõige äriettevõtte tarkvarale. Äri ei saa olla ilma toote või teenuseta. Kõik keerleb ikka selle ümber.
Kujutame ette, et meil on vaja ettevõttele teha kaks rakendust. Üks on klientidele suunatud. Nemad saavad näha kaupade hinnakirja. See on esimene kõige tähtsam asi, mida soovime. Edaspidi soovime ehk, et kliendid näeksid hindu vastavalt enda allahindlusprotsendile, saaksid toodete tellimusi esitada jne. Me siiski ei tea veel praegu päris täpselt, mida me vajame. Ärikeskkonnas toimuvat on raske ette ennustada. Me peame lihtsalt olema muudatusteks valmis.
Teine rakendus on suunatud kontoritöötajatele, kes saavad tooteid lisada ja nende hinda määrata. See on esimene asi, mida vajame. Võime vaid ette kujutada, et edaspidi me sellega ei piirdu. Ilmselt soovime kaupade laoseisu jälgida, tellimusi vastu võtta ja välja saata, tootmist planeerida jne. Jällegi me ei tea täpselt, mida me vajame, kuid soovime, et meie rakendus oleks kergesti laiendatav, mitte ei peaks selle kirjutamist alustama otsast peale.
Nüüd teeme kiiresti kliendile mõeldud rakenduse tehes mõned otsused. Millised otsused need on?
- Andmebaasiks valime MySQL (Miks? Oleme sellega harjunud.)
- Veebiserveriks Apache (Oot-oot, miks üldse veebiserver? Oleme sellega harjunud.)
- Programmeerimiskeeleks PHP (Miks? Oleme sellega harjunud, mida muud siis ikka kasutada)
OK, hakkame pihta.
MySQL skript näeb meil välja selline:
CREATE TABLE `db`.`products` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '', `name` VARCHAR(45) NULL COMMENT '', `price` DECIMAL(10,2) NULL COMMENT '', PRIMARY KEY (`id`) COMMENT ''); INSERT INTO `db`.`products` (`name`, `price`) VALUES('product1', 10); INSERT INTO `db`.`products` (`name`, `price`) VALUES('product2', 20); INSERT INTO `db`.`products` (`name`, `price`) VALUES('product3', 30.30);
Edasi index.php fail:
<!DOCTYPE html> <html lang="et"> <head> <meta charset="utf-8"> <title>hinnakiri</title> </head> <body> <?php $pdo = new PDO( sprintf( 'mysql:host=%s;dbname=%s;port=%s;charset=%s', 'localhost', 'db', '3306', 'utf8' ), 'root', '' ); $sql = 'select id, name, price FROM products'; $statement = $pdo->prepare($sql); $statement->execute(); ?> <table><tr><td>id</td><td>toode</td><td>hind</td></tr> <?php while (($result = $statement->fetch(PDO::FETCH_ASSOC)) !== false) { echo '<tr><td>'.$result['id'].'</td><td>'.$result['name'].'</td><td>'.$result['price'].'</td></tr>'; } ?> </table> </body> </html>
Vastuseks saamegi hinnakirja tabeli:
Saime selle ruttu valmis. Esialgu toon välja sellise rakenduse head küljed (kuigi neid palju pole):
- suhteliselt vähe koodi
- lihtne ja kiire, sest pole kasutatud kolmanda osapoole PHP teeke
- sain kiiresti valmis
Nüüd siis tõsised puudused:
- Oleme kohe väga seotud MySQL andmebaasiga. Andmebaas on meie arhitektuuri keskmes ja hakkab algusest peale dikteerima, kuidas me oma rakendust üles ehitame. Kui kerge oleks nüüd üle minna NoSQL andmebaasile?
- Oleme kohe ka väga tihedasti seotud veebiserveriga. See hakkab samuti meie rakendusele kitsendusi seadma.
- Meie kood on inetu segadus. Siin on segamini mitu kontseptsiooni. Kus hakkab paiknema meie äriloogika? Siin ja seal.. HTML kood on segatud andmebaasi poole pöördumise koodiga. Häirivad detailid peaks paiknema erinevates programmi kihtides, aga siin on kõik ühes puntras koos.
Me võiks jätkata puuduste väljatoomisega, aga peatume siin praegu.
Järgmises osas vaatame, kuidas rakenduse arhitektuur juba alguses paremini paika seada.
Linke:
https://www.google.ee/search?q=clean+architecture+uncle+bob&oq=clean+architecture+uncle+bob