ugrás a tartalomhoz

Fájl törlés Codeigniter-ben

Malarki · 2014. Ápr. 9. (Sze), 19.13
Üdv emberek!
Most kezdtem ismerkedni a Codeigniterrel és akadt egy kis gondom. Van egy oldalam, ahol e-bookok vannak tárolva és listázva. Akartam írni hozzá egy törlést, hogy ne kelljen egyenként kiszedni adatbázisból ha törölni akarom őket. Na most a db-ből szépen el is tűnnek, de a fájlok a könyvtárban ott maradnak. Két féle fájl van, egy maga az e-book a másik egy kép, ami a borító lenne. A kód:
ebook_model.php:
function torles_file($konyv)
	{
		$this -> db -> select('borito, filename');
		$this -> db -> from('ebook');
		$this -> db -> where('id',$konyv);
		$this -> db -> limit(1);
		 
		$query4 = $this -> db -> get();
		
		foreach ($query4->result_array() as $sor):
		$file_nev=$sor['filename'];
		$borito_nev=$sor['borito'];
		
		
		delete_files('./boritok/'.$borito_nev);
		delete_files('./konyvek/'.$file_nev);
		
		endforeach;
	
	}
ebooko_controller.php:
function konyv_torles()
		{
		$this->load->helper("file");
		$konyv= $this->uri->segment(3, 0);
		
		$this->load->model('ebookkiolvasas');
		
		
		$this->ebookkiolvasas->torles_file($konyv);
				
		
		 
		}
Hibaüzenetet nem dob ki, az adatbázistörlés(amit most innen kivettem) tökéletesen lefut.
Valaki tudna segíteni?
 
1

Segítség és tippek

orionstar · 2014. Ápr. 9. (Sze), 22.59
A delete_files() metódus a paraméterül kapott mappa összes fájlját törli, ha csak egy-egy fájlt szeretnél törölni, akkor a PHP beépített unlink() függvényével tudod megtenni. Pl.: unlink(realpath(FCPATH . '/boritok/' . $borito_nev)) - már ha tényleg ez a fájl elérési útja - az FCPATH az apllication és system mappákkal egy szinten található index.php (a program belépési pontja, ahova minden lekérés befut) elérési útját tartalmazza, tehát ehhez képest adod meg kívánt fájl elérési útját. A realpath() használatával kapod meg a végleges platform független elérési útját a fájlnak.

Néhány javaslat:
  • Ne használd a PHP alternatív szintaxisát a foreach-nél a modelben, ez csak a view fájlokban ajánlott. Az alternatív szintaxis, pláne a kódbehúzás hiányával nehezen olvashatóvá teszi a kódot.
  • Adj meg a metódusaidnak hozzáférési szinteket public/protected/private.
  • Angol nyelvet használj a változók-metódusok elnevezéséhez.
  • Tartsd be a CI kódolási stílus útmutatóját
  • Használd a CI userguide-ot minden le van bele írva, ami kellhet.
2

Alternatív szintaxis

Vilmos · 2014. Ápr. 10. (Cs), 09.35
Kérlek, magyarázd meg mi baj az "endforeach" írásmóddal.
Ezen a helyen már többször olvastam figyelmeztetést. Kerüljük az alternatívot, illetve az csak bizonyos helyen, mondjuk "view"-ban megengedett. Hiányzik az indoklás. A szokásjog is megfelelő, vagy technikai korlát ha ismersz ilyet.
3

szerintem az identálás és

szabo.b.gabor · 2014. Ápr. 10. (Cs), 09.59
szerintem az identálás és zárójelek sokkal olvashatóbb, kevesebb az overhead, megmarad a figyelem a lényegen. képzeld ha mindenhol if endif, while endwile lenne.. elveszne a lényeg.

ellenben ha keverve van a php más kóddal pl html-lel akkor hasznos, ha beszédes egy blokk lezárása, mert egy <?php } ?> rész kezdetének megtalálása igen fájdalmas lehet, itt a php 'vezérlésen' van a hangsúly, ezért kiemeljük hogy olvashatóbb legyen.
4

Olvashatóság

Vilmos · 2014. Ápr. 10. (Cs), 11.34
Megnyugodtam, nem technikai korlát.
Endif, endwhile nálam akkor van ha lelóg a képernyőről a közbezárt kódrész. A blokk végén is látom mi ért véget. Semmi közepén álló zárójel mihez tartozik, hányat kellene látnom ...
A tabulálás működik.
6

Ilyen esetben inkább

bamegakapa · 2014. Ápr. 10. (Cs), 12.14
Ilyen esetben inkább átszervezem a kódot. De a jobb editorok vizuálisan is segítenek, hogy melyik lezáró mihez tartozik.
8

és

Pepita · 2014. Ápr. 11. (P), 11.08
Én a jobb szerkesztőn kívül többnyire oda írom a záró } után megjegyzésbe a nyitó sort, a függvény nevét, stb.
12

Van aki csinálja, én még nem

bamegakapa · 2014. Ápr. 11. (P), 14.09
Van aki csinálja, én még nem éreztem szükségét. Ártani nem árt (kliens oldali Javascriptnél, ahol "ártana", a production változatban amúgy se szabadna, hogy kommentek maradjanak).
5

+1 és pár gondolat

bamegakapa · 2014. Ápr. 10. (Cs), 11.43
Az olvashatósághoz az is hozzátesz, hogy a PHP szintaxisa alapvetően kapcsos zárójeleket használ. A vezérlőszerkezetekhez (ciklusok, if, switch) van alternatív szintaxis, amit pont azért hoztak létre, hogy ha a template-eket PHP nyelven írod, olvasható maradjon a kód. De például a function, a class és mások továbbra is csak kapcsos zárójelekkel írhatók, így konzisztensebb ezt az írásmódot használni (kivéve persze a template fájlokban).

Itt pedig már bejön minden olvashatósággal általában kapcsolatos érv, például hogy a kódot nem csak magának írja az ember, stb. Mondjuk erre a legtöbben magasról tesznek, sajnos.
7

6: Kód átszervezés

Vilmos · 2014. Ápr. 10. (Cs), 23.09
Jól hangzik, konkrétan hogyan érted?
Más kódjában tapasztalhattam hasonló szemléletet. Ami nálam több képernyő az X-nél feldarabolódott egymást hívó függvény láncba. Javasolt módszer, de mégis, érdemes ezért 7-8 szintet létrehozni? (ennyi jött össze)
9

Kódszervezési ajánlások

orionstar · 2014. Ápr. 11. (P), 13.11
Több ajánlás létezik pl.: van egy 30-as elv, ami szerint maximum 30 soros lehet egy metódus, egy osztálynak max. 30 metódusa lehet és így tovább; több másik ajánlás szerint egy metódus max. 5-15 soros lehet.
Ha komolyabban érdekel a kódszervezés téma, akkor nézz utána a clean code és TDD fogalmaknak. :)
13

Kérdések

Hidvégi Gábor · 2014. Ápr. 11. (P), 14.14
Ezeket az ajánlásokat alá is szokták támasztani valamivel, vagy csak hasukra ütnek, és kijelentik, hogy harminc? Vagy tizenöt? Ennyi sor fér ki egy képernyőre? Mi van azzal, akinek rossz a szeme, és nagyobb betűket használ? Az nem zavar senkit, ha folyamatosan ugrálni kell a függvények között, hogy melyik mit csinál pontosan?
15

Az ilyen szám szerinti

bamegakapa · 2014. Ápr. 11. (P), 14.21
Az ilyen szám szerinti ajánlásokkal én sem értek egyet.

Logikusan átlátható részfeladatokra bontani a feladatot, az sokkal jobban hangzik. Logikus elnevezésekkel ugrálni se kell folyton a függvények között, ráadásul ugyanazt a részfeladatot mindig elvégeztetheted ugyanazzal a függvénnyel.
17

Szubjektív

Hidvégi Gábor · 2014. Ápr. 11. (P), 14.40
Ez is szubjektív és szokás kérdése. Mi például csak azt a kódrészletet tesszük külön függvénybe, amit legalább kétszer hívunk meg, épp itt van előttem egy kétszáztíz soros metódus; ahol szükséges, egy megjegyzésben leírjuk, mit csinál az adott blokk.
20

Nálam a 210 soros metódus

bamegakapa · 2014. Ápr. 11. (P), 15.46
Nálam a 210 soros metódus kapásból kuka :).
27

Ne viccelj már :) Tényleg 210

BlaZe · 2014. Ápr. 11. (P), 21.08
Ne viccelj már :) Tényleg 210 sort át kell nézni, ha valaki fel akarja fogni mi van egy adott metódushívás mögött Általánosságban ha commenttel kell jelezni, hogy egy kód mit csinál, az azért van, mert a kód nem önkifejező. A metódusok szétdarabolása ebből fejlődött tovább: a metódus neve fejezi ki valójában, hogy mit csinál. Ennek több előnye is van a spagetti kóddal szemben:
  • Ránézéssel azonnal átlátod mit csinál a metódus, nem kell végigtekerni egy marhanagy kódot.
  • A comment nem él együtt a kóddal, nagy részük előbb-utóbb nem tükrözi a valós működést és csak félrevezeti a később odatévedő fejlesztőt. Tudom, erre mindenki figyel, mégis ez egy létező probléma.
  • Nem vezérlési szerkezetek tömkelegét kell felfognod, hanem nagyjából egy mondatszerű hívási láncot.
  • A spagettikóddal szemben ez tesztelhető, és karbantartható.
Nem tudom ebben mi a szubjektív. A szokást aláírom, a spagetti kód egy rossz szokás :)
29

Szubjektív

Hidvégi Gábor · 2014. Ápr. 11. (P), 21.36
Én például jobban szeretem átlátni az egészet úgy, hogy közben nem kell ugrálgatni a részfüggvények között és nem kell nekik átadni egy rakat változót. Sem a metódus, sem pedig a programozócsapat nem változik olyan gyakran, hogy ez gondot okozna. A mondatos hasonlatod nekem is eszembe jutott, amikor a kommentekről írtam, de erre nekünk nincs szükségünk, 210 a leghosszabb, de akad jópár 150 körüli is.
18

Is is

Pepita · 2014. Ápr. 11. (P), 15.01
Veled is egyetértek, de Gáborral is: akkor felesleges és rossz példa külön metódusba írni valamit, ha csak egyszer hívod meg. De tkp te is részfeladatok újbóli elvégzését írtad.
A számok pedig kinek mennyi (szerintem 10 és 500 közt :)), és ugyanúgy a stack terheltsége is...
Az első és legfontosabb dolog, hogy te később is átlássad a kódod, és rögtön a második, hogy a kollégáid is. Aztán ahány ház, annyi szokás...
24

Stack vs inlining

BlaZe · 2014. Ápr. 11. (P), 20.47
ugyanúgy a stack terheltsége is
A mai modern fordítók már inlineoznak, és egyéb optimalizációkat végeznek, a valóságban elég nehezen felismerhető már az a kód, amit a fordító végül futtat. Egy normális fordítónál az így szervezett kód nem okoz overheadet.
10

Igen, szerintem ilyenkor

bamegakapa · 2014. Ápr. 11. (P), 14.06
Igen, szerintem ilyenkor érdemes a logikusan összetartozó műveleteket külön függvénybe szervezni (esetleg komolyabb átalakításokat eszközölni). Ilyen módon a kód is olvashatóbb (+ gyorsan átfuthatóbb) lesz, ha megfelelő elnevezéseket használsz, másrészt nálam a legtöbb esetben úgy adódik, hogy ezeket az egyes részfeladatokat később máshonnan is meg akarom hívni - tehát eleve érdemes külön szervezni őket.

Persze mindig vannak kivételek, de ha a kódomban megjelenik egy monolit függvény/metódus, ami ki se fér a képernyőre, akkor azért gyanút fogok, hogy valami itt nem stimmel :).
11

Olvashatóság

Hidvégi Gábor · 2014. Ápr. 11. (P), 14.08
Az, hogy kinek mi olvasható, megszokás kérdése, ha valaki mindig endforeach-et használt, akkor számára a kapcsos zárójelek lesznek furcsák. Tehát ebben a témában mindenki csak a szubjektív véleményét tudja leírni, így ezen vitatkozni sok értelme nincs.

Ennél sokkal fontosabb, hogy egy cégen belül mindenki ugyanazokat a konvenciókat alkalmazza, ennek betartatása pedig a cégvezetés dolga, mert a programozók maguktól valószínűleg nem fognak erre figyelni.
14

Érdemesebb inkább a kapcsos

bamegakapa · 2014. Ápr. 11. (P), 14.14
Érdemesebb inkább a kapcsos zárójelekre rászokni, mivel aki örökli a kódodat, illetve akitől te örökölsz majd, 99%, hogy kapcsos zárójeleket használt és nem endforeach-et. Ebben nincs semmi szubjektív. Ha konvenciókról van szó, érdemes a többséget követni, hacsak nem szakmailag butaság, amit csinálnak (jelen esetben nyilván nem).
16

Szubjektív

Hidvégi Gábor · 2014. Ápr. 11. (P), 14.32
Nem ez a lényege annak, amit írtam. A kapcsos zárójelezés még viszonylag egyszerű kérdés, de utána jön a többi: a kezdő kapcsos zárójelet a sor végére vagy a következő sor elejére tegyem, tabokat vagy szóközöket használjak-e, mennyit stb. Ez utóbbiakban már jóval megosztottabbak a programozók, ezért az a fontos, hogy az adott mikroközösségen (cégen) belül, akik használják a kódot, következetesen ugyanaz legyen a forma.
19

Ezzel így természetesen

bamegakapa · 2014. Ápr. 11. (P), 15.44
Ezzel így természetesen egyetértek.

Én arra válaszoltam, amit írtál (ahhoz, amiről egyébként szó volt):

Az, hogy kinek mi olvasható, megszokás kérdése, ha valaki mindig endforeach-et használt, akkor számára a kapcsos zárójelek lesznek furcsák. Tehát ebben a témában mindenki csak a szubjektív véleményét tudja leírni, így ezen vitatkozni sok értelme nincs.
21

Orionstar: Kódszervezési ajánlások

Vilmos · 2014. Ápr. 11. (P), 16.13
A 30 sorral az a baj hogy meg lehet csinálni. És akkor elértük a kitűzött célunkat, de semmi mást. Mert ugyan miért alakulna a program kedvezően, ha legfőbb szempontunk a maximált sorszám? (pontosabban, elsőbbsége van a logikával szemben is)

Érdekel a kódszervezés meg nem is. A módszertanok zöldmezős fejlesztésre vonatkoznak, általában. Én így értékelem őket, ilyennek látszanak. Ha módosítandó valami, és nálam ez volt a gyakori, akkor ott van az "átalakítás". Ha nem elég akkor még mindig lehet "refaktorálni". Szóval, amit gyakran csináltam arra szűk a módszertani választék.
22

A módosítás szerintem

bamegakapa · 2014. Ápr. 11. (P), 16.46
A módosítás szerintem mindenkinél gyakran előfordul, és a legtöbb esetben a módosíthatóság alapvető elvárás. A jól szervezett kódnak épp az lenne az egyik ismérve, hogy könnyen módosítható (ennek ugye egyik alappillére, hogy jól átlátható. értelmezhető is legyen).

Szóval a módszertanok lehet, hogy épp arra vannak kitalálva, amit te csinálsz? :)
23

Beyond clean codeDo you

Hidvégi Gábor · 2014. Ápr. 11. (P), 18.17
Beyond clean code
There are only two types of code, code that delivers business value, and code that doesn't.
Do you understand what needs to be written? Then use TDD. Do you understand the problem, but not the solution (at least fully)? Use DIRTI.
(Develop, Isolate, Refactor, Test, Integrate)
25

Módosítás

Vilmos · 2014. Ápr. 11. (P), 21.04
Módosítás: Tesztelt, bevezetett program. Derült égből új üzleti igény. A program hiányos, különben nem kellene hozzányúlni. A bővítés a meglévő kód tuningolását jelenti, nem modul meg réteg cserét. (általában)

Probléma, valahol módosítani kell. Az a rész nincs jelölve. Hogy találom meg? Hol itt a módszertan? TDD?
Eddig lehet, szabálytalanul jártam el. Mivel üzleti alkalmazásról van szó, a keresést a "perzisztencia" felől kezdtem. Az megmutatta mely programrészeket érint a bővítés. A módszertanokban mindig kód és kód és kód játszik. Hogy miért pont azok amelyek, azt adottnak veszik.
30

Erről van szó

Hidvégi Gábor · 2014. Ápr. 11. (P), 21.51
Érdemes megismerni a módszertanokat, mert segíthetnek, de én például szkeptikus vagyok velük kapcsolatban, és nem véletlenül.

Tipikus eset, amikor bemutatnak egy újabb lehetőséget, leírják, hogy mik az előnyei, és hogy ez nekik mennyit segített a munkában. Ez eddig szép és jó, de a hátrányok bemutatásáról általában el szoktak feledkezni, márpedig az éremnek mindig két oldala van, és általában olyan, amit te is írsz, hogy "derült égből új üzleti igény", ami sehogy sem illik a korábbi működésbe (nekünk pont ma volt ilyen, de aztán a főnököm egyelőre lemondott róla).

Egy nagyon jó példa erre egy általam nemrég talált blogbejegyzés, ami a Scrum metódust mutatja be, aztán a kommentek között valaki leírja, hogy mindaddig működik a dolog, amíg ideálisak a feltételek, azaz van pénz és nem sürget az idő, de ahogy legalább egy nem teljesül, borul a bili (érdemes elolvasni a többi hozzászólást is).
31

Te miben hiszel?

BlaZe · 2014. Ápr. 11. (P), 23.15
Ez elsőre lehet picit övön alulinak fog tűnni, de valóban kíváncsi vagyok. Van bármi olyan széleskörben alkalmazott és elfogadott best practice, módszertan stb, amiben hiszel és alkalmazod?
34

Persze

Hidvégi Gábor · 2014. Ápr. 12. (Szo), 10.06
1, közvetlenül ne hívjuk meg a mysql_/pg_/stb. függvényeket, hanem fedjük el őket
$valasz = lekerdezes($sql);
2, teljesen válasszuk szét a programlogikát és az adatokat a megjelenítéstől

A többi projektfüggő.
35

Ennek fényében fura, hogy

BlaZe · 2014. Ápr. 12. (Szo), 10.51
Ennek fényében fura, hogy habár felismered a szétválasztás és az absztrakció fontosságát, mégis kampányolsz ellene :) Azt mondjuk nem tudom valójában érted-e, hogy pl a design patternek pont erről szólnak (amit írtál, az is egy design pattern).
36

Igen, de én ebben az esetben

Hidvégi Gábor · 2014. Ápr. 12. (Szo), 11.33
Igen, de én ebben az esetben nem azért döntöttem a szétválasztás mellett, hogy megfeleljek egy tervezési mintának, hanem a munkám során kiderült, hogy ez jár a legtöbb haszonnal. Az absztrakciók szintjét pedig igyekszem a legalacsonyabb szinten tartani.
37

Igen, de én ebben az esetben

BlaZe · 2014. Ápr. 12. (Szo), 12.41
Igen, de én ebben az esetben nem azért döntöttem a szétválasztás mellett, hogy megfeleljek egy tervezési mintának, hanem a munkám során kiderült, hogy ez jár a legtöbb haszonnal.
Senki nem azért használ tervezési mintákat, mert vannak, hanem azért vannak, mert használjuk őket, ahol kell. Ahogy te is írod.

Az absztrakciók szintjét pedig igyekszem a legalacsonyabb szinten tartani.
És így hogy írsz pl unit teszteket?
38

Senki nem azért használ

Hidvégi Gábor · 2014. Ápr. 12. (Szo), 13.44
Senki nem azért használ tervezési mintákat, mert vannak, hanem azért vannak, mert használjuk őket, ahol kell.
Ha ez így lenne, akkor nem küldtem volna be ezt a két blogmarkot (pontosabban maguk az írások sem születtek volna meg).

És így hogy írsz pl unit teszteket?
Sehogy. Az alkalmazásunk jellegéből adódóan ennek nincs sok értelme, a magamnak készített fejlesztések pedig olyan egyszerűek, hogy azért nincs értelme.
39

Ha ez így lenne, akkor nem

BlaZe · 2014. Ápr. 12. (Szo), 18.32
Ha ez így lenne, akkor nem küldtem volna be ezt a két blogmarkot (pontosabban maguk az írások sem születtek volna meg).
Persze, és tollal is lehet embert ölni, úgyhogy a toll rossz, ne használjuk :)

Sehogy. Az alkalmazásunk jellegéből adódóan ennek nincs sok értelme, a magamnak készített fejlesztések pedig olyan egyszerűek, hogy azért nincs értelme.
Miért, mit fejlesztetek? For ciklust, ami elszámol tízig? :) Nehezen tudok elképzelni olyan alkalmazást, ahol ne érdekelne, hogy hibát viszek bele...
40

Persze, és tollal is lehet

Hidvégi Gábor · 2014. Ápr. 12. (Szo), 19.11
Persze, és tollal is lehet embert ölni, úgyhogy a toll rossz, ne használjuk :)
Az írások arról szólnak, hogy ésszel használjuk a mintákat és az absztrakciókat, nem arról, hogy kerüljük őket.

Nehezen tudok elképzelni olyan alkalmazást, ahol ne érdekelne, hogy hibát viszek bele...
Akkor olvasd el ezt.
41

Visszakérdezek: te milyen

Hidvégi Gábor · 2014. Ápr. 13. (V), 17.11
Visszakérdezek: te milyen praktikákat/módszereket szoktál alkalmazni?
42

Mi scrumot használunk, picit

BlaZe · 2014. Ápr. 13. (V), 21.54
Mi scrumot használunk, picit az adott projectre szabva. Illetve azokat alkalmazzuk, amikkel nem értesz egyet :) Reactive alkalmazásokat fejlesztünk OOP nyelven, clean code, SOLID, design patterns, continuous delivery és társaik. Van egy viszonylag szigorú "definition of done"-unk: megfelelő teszt lefedettség (unit, component, integration), code review, release-elés, funkcionális teszt környezetben deployolva kell legyen (hogy tesztelhető legyen, mielőtt tovább megy a feature a processen) stb. Emellett a release kiadása előtt mindig végzünk rollback tesztet (adatbázis, alkalmazás, config, infrastruktúra ha kell).

Ezekkel megnyerjük azt, hogy többnyire igen jól olvasható és karbantartható a kódbázis. Valamint még fejlesztési időben elkapjuk azoknak a hibáknak a jó részét, amit a tesztelés hiánya miatt simán becommitolnánk, és bekerülne a releasebe. Ez sok egyéb szempont mellett azért nagyon fontos, mert így a legolcsóbb a hibák javítása. Ha ezen a fázison túljut egy probléma, akkor a fejlesztő már máson dolgozik, több időbe kerül neki a probléma lokalizálása (context switch), esetleg blokkol vele más fejlesztőket, vagy ami még rosszabb, már ráépítettek a hibás komponensre, ezért a javítás nem lokális, hanem szerteágazó. Ha a manuális tesztelésről pattan vissza a feature, akkor azt újra le kell majd tesztelni, ami sok idő, és az emberi erőforrás a legdrágább. Emellett a manuális tesztelés nem tud teljesen átfogó lenni, így önmagában abban nem bízhatunk meg. Én személy szerint azt gondolom, hogy a minőséget mindezek nélkül nem lehet biztosítani, és az otthoni pet projecteket leszámítva (de néha még ott is) ez egy alapvető elvárás. Amikor fejlesztünk, valakinek a idejével, pénzével "játszunk". Megrendelő, cégvezető, saját... Márpedig ha nincs minőségbiztosítás, igen nehéz kivédeni a szükségtelen kockázatot. Minőséget pedig csak viszonylag merev szabályokkal lehet biztosítani. Amiket néha áthágunk, ha a szükség úgy hozza (és ezt dokumentáljuk), vagy alakítunk rajta, ha nem jól fedi le az igényeket. De a szükségességét szerintem nem lehet elvitatni. Ezt az egész processt pedig a project méretéhez, igényeihez kell igazítani, egy 3 fős kiscég nyilván nem tud fenntartani egy nagy infrastruktúrát, vagy ha úgy tetszik bürokráciát. A pár sorral feljebb írtakat figyelembe véve (más pénzével, idejével játszunk) azzal viszont egyáltalán nem tudok egyetérteni, hogy az automata teszteket érdemes elhagyni, mert "növelik a fejlesztési időt", vagy mert "majd a userek letesztelik", vagy mert "a mi alkalmazásunk nem igényli az automata tesztelést". Mindet nagyon jól meg lehet cáfolni. Egy dologgal értek egyet: a bevezetése költséges, ha nincs(enek) olyan ember(ek) a csapatban, aki(k)nek van jó tapasztalata. De ez gyakorlatilag mindenre igaz, és csak egyszer kell megfizetni.
43

90%

Vilmos · 2014. Ápr. 14. (H), 09.37
Tankönyv szerinti módszer. Tizen éve olvastam egy cikket a fejlesztési költségekről. Nagy projektekről írtak, mi másról. Tanulságos volt, mert az összes kiadás 90%-át a tesztelés vitte el. (Hogyan mérték, a cikk erre nem tért ki.) Közismert, kis cégek, kis projektek ebből szoktak lefaragni.
Úgy tűnik, amikor elvekről beszélsz akkor elsősorban a tesztelést szolgáló módszerekről van szó.
44

Finomítok az álláspontomon:

Hidvégi Gábor · 2014. Ápr. 14. (H), 09.47
Finomítok az álláspontomon: nem azt mondom, hogy ezekkel nem értek egyet, mert igenis elképzelhetőnek tartom, hogy az általad leírt módszerek bizonyos esetekben hasznosak, segíthetnek – de nem mindenhol. Érzésem szerint nagy projekteknél van hasznuk, ahol van rá keret, sokan dolgoznak együtt, és mindenképp szükség van szabályokra és absztrakcióra a feladat nagysága miatt.

Viszont kisebb projekteknél nem feltétlenül éri meg ezeket használni, mert esetleg többe kerül a leves, mint a hús, ráadásul a szivárgó absztrakciók miatt célszerű minél egyszerűbben elkészíteni a szoftvert, hogy minél kevesebb hibalehetőség legyen benne.

Ha a manuális tesztelésről pattan vissza a feature, akkor azt újra le kell majd tesztelni, ami sok idő, és az emberi erőforrás a legdrágább.
Vannak olyan alkalmazások, ahol csak az emberi tesztelés a leghatékonyabb.
45

Nem is írtam, hogy mindenhol

BlaZe · 2014. Ápr. 14. (H), 12.56
Nem is írtam, hogy mindenhol pont úgy kell használni, ahogy mi használjuk. Sőt, azt írtam, hogy minden módszert finomhangolni kell az adott projecthez. És hogy van, amit nem bír el egy kis project/csapat. De az automata tesztek írása tipikusan nem ez a problémakör. Valóban, a tesztek írása X% programozói időt elvesz a feature fejlesztés elől amikor írjuk őket, de ez bőségesen bejön, amikor azonnal elkap dolgokat, amikre nem gondoltál, és iterálhatnál rajta utána egy csomót, hogy miért bugos. Ha úgy tetszik, ez egy befektetés a jövőbe. Analóg azzal, hogy félreteszel-e a fizetésedből, vagy nem. Elköltheted az egészet, és maximalizáltad az erőforrások (jelen példában fizetés) prompt kihasználását, de cserébe a jövőben nem fog védeni, ha épp nincs munkád, beteg leszel, vagy bármi. Az automata teszt ugyanez.

Szivárgó absztrakciók. Szerintem totálisan félreértelmezed Joel cikkét (gondolom innen fúj a szél). Nem azt írja, hogy ne használj absztrakciót mert az rossz, hanem hogy attól még hogy absztrakciót használsz, ismerd a problémád számára fontos abszrakciók mögötti valós működést. Ez egy nagyon nagy különbség :) Az absztrakciók segítenek egyre hatékonyabb, komplexebb és átláthatóbb programokat írnunk. Ezt ő is kiemelte a cikkében. Egy mezítlábas függvényhívás ugyanolyan absztrakció, mint ami egy design pattern mögött van pl. Mondhatnám, hogy akkor programozz assemblyben, de hát az is egy nagyon durván magas absztrakciós szint a processzor belső működéséhez képest :) Amit ebből le lehet szűrni, hogy gondolkodó ember módjára kell softwaret fejleszteni, és meg kell látni a feladat mögött a lényeget, és hogy ahhoz milyen eszközt kell használni.

Vannak olyan alkalmazások, ahol csak az emberi tesztelés a leghatékonyabb.
Az se ment át, amit én írtam :)
46

Valóban, a tesztek írása X%

Hidvégi Gábor · 2014. Ápr. 14. (H), 13.18
Valóban, a tesztek írása X% programozói időt elvesz a feature fejlesztés elől amikor írjuk őket
Itt csak arra tudok hagyatkozni, amit mások írtak:
  • A Wikipédia szerint "for every line of code written, programmers often need 3 to 5 lines of test code"
    - A fejlesztés ideje ez alapján legalább négyszerese annak, ahol nincsenek tesztek
    - Az össz programkód négyszerese a szükségesnek, ennyivel több hibázási lehetőséggel
  • A tesztelés akkor hatékony, ha tesztelésben gyakorlott programozó írja őket
  • A tesztelés akkor hatékony, ha a teszteket nem ugyanaz a programozó készíti, mint aki a kérdéses függvényt, mert szükségszerűen nem fog tudni minden esetet letesztelni (nem látja a fától az erdőt)
  • A tesztek futtatása is idő, amíg a programozó kénytelen mással foglalkozni


Nem azt írja, hogy ne használj absztrakciót mert az rossz
Én sem azt mondom, hogy ne használj absztrakciókat, hanem azt, hogy minél kevesebbet.
  • Mivel minden absztrakció szivárog, minél többet használsz, annál nagyobb az esély, hogy lyukra futsz
  • A probléma komplexitásának 10% növekedése, a szoftvermegoldás komplexitásában 100%-os növekedést eredményez.
    A szoftverfejlesztés elfelejtett alapigazságaiból.
47

A fejlesztés ideje ez alapján

BlaZe · 2014. Ápr. 14. (H), 14.05
A fejlesztés ideje ez alapján legalább négyszerese annak, ahol nincsenek tesztek
Nem ismétlem magam sokadszor. Röviden: ez nem igaz.
Az össz programkód négyszerese a szükségesnek, ennyivel több hibázási lehetőséggel
A teszt nem része a programnak.
A tesztelés akkor hatékony, ha tesztelésben gyakorlott programozó írja őket
Az alkalmazás akkor hatékony, ha fejlesztésben gyakorlott programozó írja őket. Tanuljunk...
A tesztelés akkor hatékony, ha a teszteket nem ugyanaz a programozó készíti, mint aki a kérdéses függvényt, mert szükségszerűen nem fog tudni minden esetet letesztelni (nem látja a fától az erdőt)
Ez sem igaz így teljes egészében.
A tesztek futtatása is idő, amíg a programozó kénytelen mással foglalkozni
Nem kell az egész hóbelebancot mindig lefuttatni. Arra ott a CI szerver.

Én sem azt mondom, hogy ne használj absztrakciókat, hanem azt, hogy minél kevesebbet.
Ő ezt sem írta. És ez értelmetlen is.
Mivel minden absztrakció szivárog, minél többet használsz, annál nagyobb az esély, hogy lyukra futsz
Ez mégis mit jelent? :)
A probléma komplexitásának 10% növekedése, a szoftvermegoldás komplexitásában 100%-os növekedést eredményez.
Az absztrakció nem a megoldandó probléma komplexitását növeli, maximum az architektúráét. Ami néha szükséges, néha nem. Akkor beszélünk over-engineeringről, ha a megoldandó problémához képest egy nagyságrendekkel komplexebb megoldást választunk, tehát indokolatlanul. Az absztrakció ezzel nem szinonim fogalom.

Megint az az érzésem van, hogy olyan dolgon vitatkozol, amiben nincs értékes project tapasztalatod, és dobálsz be idézeteket, meg kontextusából kiragadott fogalmakat, amik teljesen nem illenek oda, és jellemzően nem állják meg a helyüket.
48

»A fejlesztés ideje ez

Hidvégi Gábor · 2014. Ápr. 14. (H), 15.12
»A fejlesztés ideje ez alapján legalább négyszerese annak, ahol nincsenek tesztek«
Nem ismétlem magam sokadszor. Röviden: ez nem igaz.
Ok, utólag belegondolva, valószínűleg nem lesz annyi. Tapasztalataid szerint mennyivel növeli meg a fejlesztési időt?

»Az össz programkód négyszerese a szükségesnek, ennyivel több hibázási lehetőséggel«
A teszt nem része a programnak.
Ettől függetlenül program, és ugyanúgy hibázni fog benne az ember. A kimaradt tesztesetekről nem is beszélve.

»Én sem azt mondom, hogy ne használj absztrakciókat, hanem azt, hogy minél kevesebbet.«
Ő ezt sem írta. És ez értelmetlen is.

»Mivel minden absztrakció szivárog, minél többet használsz, annál nagyobb az esély, hogy lyukra futsz«
Ez mégis mit jelent? :)
A felsőt én írtam, és nem értelmetlen, mert abból következik, amit Joel on Software állít.

Vegyünk egy aktuális példát: korábban volt egy blogmark, az alapján találtam ezt a linket, ahol leírják, mi a gond mobilokon a böngésző alapú alkalmazásokkal. Nézzük az absztrakciós listát Androidon:
- DOM objektum
- böngésző
- virtuális gép
- operációs rendszer
- hardver

Mindegyik absztrakciós szint egy újabb szivárgást hoz be, például azt, hogy böngészőben nem tudod a memóriát menedzselni, hanem az automatikus (GC), valamint az egyes objektumok jóval több memóriát foglalnak el, mint amennyi kevesebb szint esetén szükséges lenne. Ennek a következménye (többek között), hogy a natív alkalmazások ismét virágkorukat élik, és még úgy is megéri velük foglalkozni, hogy tudjuk, elvileg a közös webes platformon elég lenne egyszer megírni őket.

Amire nem válaszoltam, azon gondolkozom.
49

Tapasztalataid szerint

BlaZe · 2014. Ápr. 14. (H), 16.06
Tapasztalataid szerint mennyivel növeli meg a fejlesztési időt?
Ha semmi mást nem nézünk, csak azt, hogy egy metódust mennyi idő alatt írunk meg, ahhoz képest nyilván több idő kell hozzá. Hogy mennyivel, az a komplexitástól függ, teljesen változó. De nem ez érdekel minket. Hiszen a tesztelés nem az adott feature implementációját támogatja, hanem a karbantartásáét, illetve a minőség biztosítását. És ez az a 2 pont, amin el szoktak úszni a projectek. A karbantartás ott kezdődik, hogy bekerült a repóba. Onnantól más épít rá stb. Így ezt az egészet nézve véleményem szerint csökkenti a fejlesztési időt. Hiszen ha mást nem is, azt onnantól kezdve biztosítod, hogy amire gondoltál mint lehetséges hiba, az ki van védve. Ezért is kezdjük azzal a hibák javítását, hogy reprodukáljuk teszttel...
Ettől függetlenül program, és ugyanúgy hibázni fog benne az ember. A kimaradt tesztesetekről nem is beszélve.
Ebből nem tudom mit akarsz kihozni. Ha nem jó a teszt, vagy hiányzik, akkor valóban nem hasznos.

A felsőt én írtam, és nem értelmetlen, mert abból következik, amit Joel on Software állít.
Semennyire nem következik belőle. Ezt írta:

Ten years ago, we might have imagined that new programming paradigms would have made programming easier by now. Indeed, the abstractions we've created over the years do allow us to deal with new orders of complexity in software development that we didn't have to deal with ten or fifteen years ago, like GUI programming and network programming. And while these great tools, like modern OO forms-based languages, let us get a lot of work done incredibly quickly, suddenly one day we need to figure out a problem where the abstraction leaked, and it takes 2 weeks.
Ebből én nem tudom azt kiolvasni, amit állítasz. Hasonló, mint a tesztnél: összességében vastagon nyersz vele, hiszen lényegesen nagyobb problémákat tudsz sokkal rövidebb idő alatt megoldani, mint korábban, alacsonyabb absztrakció mellett. De néha le kell ásni rendesen a mélyére. Hát ilyen ez a filmes szakma :) Nincs ingyen ebéd.

Az androidos példádra nem tudok érdemben reagálni, mobil fejlesztéssel eddig még nem foglalkoztam, így nincs releváns tapasztalatom, csak pet project jellegű. De azt azért ne felejtsd el, hogy ez még mindig egy viszonylag új terület, ahol a gyártók még nem, vagy csak a high-end területen találták meg a választ ezekre a problémákra. Az egész iparág célja, hogy általánosságban minél magasabb absztrakciós szinten dolgozzunk, hisz annyival nagyobb értékű funkcionalitást tudunk implementálni egységnyi idő alatt. Ezért ahogy az Intelnek is megjött a válasza pl a polimorfizmusra (unconditional branch prediction), úgy szerintem a mobil iparnak is meg lesz.
32

Minden módszernek van

bamegakapa · 2014. Ápr. 11. (P), 23.27
Minden módszernek van hátránya, és ezek sokszor csak bizonyos körülmények között jelentkeznek. Saját tapasztalat, hogy a módszer alkalmatlanságát gyakran az okozza, hogy az alkalmazó (adott esetben én) nem értette meg (vagy nem akarta) rendesen a módszer lényegét.

Hirtelen az a példa jut eszembe, hogy bár a kalapács remek eszköz szögek beverésére, akik mindig az ujjukra csapnak a szög helyett, többnyire a kalapácsot fogják szidni.

Ehhez jön hozzá, hogy nem létezik Szent Grál, tehát hibát mindenben fogsz találni. Mivel a módszertanok használata igényli, hogy feladd bizonyos szokásaidat, berögzött módszereidet, tehát alkalmazkodóképességet igényel, rendkívül sok programozó kapásból bukja az egészet (mivel hát emberek vagyunk mi is, na). Ekkor persze mivel a hiba biztos nem bennem van, be kell bizonyítani, hogy a módszer fassság és mivel bizonyára vannak hibái, könnyen el is hiteted magaddal (velem legalábbis így volt/van, és ezt a mintát sok helyen vélem felfedezni).

Affelé hajlok, hogy mivel a mi szakmánkban mindennapos dolog a "derült égből üzleti igény", tekintve hogy a döntéshozók többnyire analfabéták, ami még nem lenne baj, de ráadásul kompetensnek hiszik magukat, nekünk olyan módszereket kéne használnunk, hogy erre fel legyünk készülve, nem? Merthogy szakemberek vagyunk. Ha egy módszer 5%-al megnöveli a projektem rugalmasságát, cserébe néhány szokásomat fel kell adnom, akkor szakemberként ez jó üzletnek tűnik, még ha emberként nem is.

Szóval, a te szavaiddal élve, én igen szkeptikus vagyok a módszertanok fikázóival kapcsolatban, és nem véletlenül :).
33

tekintve hogy a döntéshozók

Hidvégi Gábor · 2014. Ápr. 12. (Szo), 09.32
tekintve hogy a döntéshozók többnyire analfabéták, ami még nem lenne baj, de ráadásul kompetensnek hiszik magukat
Biztos van ilyen is, de szerintem inkább az a helyzet, hogy a legtöbb probléma sokkal bonyolultabb, mint ahogy azt képzelik, ráadásul minél több eszközt vagy módszertant (azaz [szivárgó] absztrakciót) használunk, annál nehezebb lesz átlátni az egészet.

Ha egy módszer 5%-al megnöveli a projektem rugalmasságát
Mi alapján tudod megmondani előre, hogy az adott módszer valóban ennyivel növeli a rugalmasságot? Mi van, ha több módszert is alkalmazol, azok kombinációja is feltétlenül rugalmasabbá teszi a projektet? Minden újabb módszer újabb szabályok bevezetésével jár, nem fogják ezek ütni egymást?

Szóval, a te szavaiddal élve, én igen szkeptikus vagyok a módszertanok fikázóival kapcsolatban, és nem véletlenül
A módszerek kritizálói mindig konkrét példán keresztül mutatják be, hogy az adott helyzetben hol érte őket hátrány.

Hogyan tudsz valamiről jó döntést hozni, ha nem ismersz pro és kontra érveket?
26

A módszertanok zöldmezős

BlaZe · 2014. Ápr. 11. (P), 21.06
A módszertanok zöldmezős fejlesztésre vonatkoznak, általában. Én így értékelem őket, ilyennek látszanak.
Ezt mire alapozod? Vagy pontosan milyen ajánlásokra gondolsz?
28

Talán az életciklus modell

Vilmos · 2014. Ápr. 11. (P), 21.22
Talán az életciklus modell kelti bennem az érzetet.
Ezt olvastam: Ha eljutott a dolog a bevezetésig akkor új igény esetén "goto 1". Szerintem akkor már más feltételek között kell fejleszteni. Nincs szükség ágyúra, a meglévő kód kötöttséget jelent. Melyik módszertan számol ezzel, és hogyan?
Az a példa, miszerint létrehozzuk az interfészt üresen, utána majd csak megoldjuk, az tiszta lapon rendben van. Általában ami későbbre halasztja a tényleges munkát az nem látszik megfelelőnek. Vagy én nem tudok velük mit kezdeni.