[php] Auto code generation

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
inleiding
Zo'n twee weken spookt er een plan door mijn hoofd. De mensen met wie ik het idee besproken heb, hebben me voor gek verklaard, maar ik denk dat het idee te verwezelijken is.

Welke programmeur baalt er niet als een stekker van om voor relatief eenvoudige projecten iedere keer dezelfde handelingen te verrichten. Ik heb zelf een aftreksel van het MVC framework Mojavi gemaakt voor PHP 4 (Model, View, Controller, FilterCain die de ExecutionFilter aanroept, User profielen voor het opslaan van temporary data). Kortom heel lichtgewicht. Het framework regelt alleen dingen voor je, voor de rest niet.
Ik merk gewoon dat ik voor bepaalde dingen constant hetzelfde doe; copieer Model classes, wijzig wat namen, pas wat parameters aan, copieer een view, wijzig de bestandsnaam en classnamen, verander wat parameters, kopieer een view template en pas die wat aan en klaar is Kees; je nieuwe action werkt. Hier word ik dus moe van. Het uitdenken en opzetten van een architectuur is vele malen leuker dan het implementeren ervan.

Het idee
Toen kwam het idee in mij op: waarom niet een programma schrijven die een architectuur specificatie inleest en zelf de Object Georienteerde PHP code genereert? Toen ik dit aan een aantal mensen vertelde, lachten ze me uit. Ik denk alleen dat het best haalbaar is in situaties waar je vaak een statische layout heb: de beheerkant van het systeem.

Doel van dit topic
Ik wil hier een discussie starten over dit idee. Ik vraag me af hoe anderen hier tegen aan kijken. Zien jullie mogelijkheden? Hebben jullie ideeen? Kennen jullie dit idee al vanuit de praktijk?

Toen ik wat vooronderzoek ging doen op Google kwam ik op een site uit die al enigsinds aan code generatie doet. Alleen wordt het een grote spaghetti code die niet mooi OOP gestructureerd is. Aangezien software niet alles kan, maar wel 80% (er zijn immers altijd uitzonderingen) is OOP haast een must.

Mijn gedachtengangen
OOP is een must zoals hiervoor al gezegd is. Ik wil een specificatie maken waarin ik de database structuur kan beschrijven inclusief de onderliggende relaties. Of ik gebruik wil maken van OR mapping mbv Propel is nog niet duidelijk en eigen ook maar een invulling van het systeem.
Wanneer je database structuur duidelijk is wil je je Actions en Modules gaan beschrijven. Dit is de meest ingewikkelde stap. Elke situatie is immers anders en in sommige gevallen wil je andere Views dan in andere gevallen.

vb. Stel je het een eenvoudig probleem: categorien, nieuwsberichten, reacties. Voor het toevoegen van nieuwsberichten kunnen er een aantal dingen aan de hand zijn. Als eerste is het van belang dat de cardinaliteit van je categorien bekend is; in sommige gevallen heb je slechts een handjevol categorien en kan je bij het toevoegen van je nieuwsbericht een dropdown gebruiken. In andere gevallen is je categorie structuur dusdanig complex dat je eerst moet navigeren naar de categorie, waarna je er een bericht in kan plaatsen.

Je moet dus verschillende soorten Views hebben en kunnen gebruiken. Het beschrijven van je architectuur zal in XML gebeuren en ik heb een eerst idee gemaakt voor een opzet.

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<architecture>
  <!--
    Views gedefinieerd met de voor hun bestemde beperkingen
    variabelen. In je systeem is er dus voor elke View een aparte
    implementatie die elke View anders behandelt.
  -->
  <views>
    <view name="default">
      <constraints />
    </view>
    <view name="all">
      <constraints>
        <constraint name="display" value="horizontal" />
      </constraints>
    </view>
    <view name="paging">
      <constraints>
        <constraint name="limit" value="20" />
        <constraint name="display" value="vertical" />
        <constraint name="order" value="title" />
      </constraints>
    </view>
    <view name="limit">
      <constraints>
        <constraint name="limit" value="10" />
        <constraint name="display" value="horizontal" />
        <constraint name="order" value="title" />
      </constraints>
    </view>
  </views>
  <!-- 
    enkelvoudige categorien,dus geen boomstructuur met parents
  -->
  <module name="category" cardinality="small">
    <actions>
      ...
    </actions>
  </module>
  <module name="product" cardinality="small">
    <actions>
      <action name="Overview" view="paging">
        <paging />
        <overview>
          <datagrid>
            <!-- 
              format geeft het formaat aan en dus welke GUI
              component er gebruikt moet worden. Insert staat
              default op Manual, maar er is ook voor elk format
              een auto; de waarde wordt automatisch door het
              systeem ingevuld. 
            -->
            <attribute name="product_id" format="primary" insert="auto" />
            <attribute name="date" format="date" insert="auto" />
            <attribute name="category.name" format="default" />
            <attribute name="title" format="default" />
            <attribute name="photo" format="image" />
            <attribute name="price" format="price" />
          </datagrid>
        </overview>
        <paging />
      </action>
      <action name="Insert">
        <insert view="default">
          <datagrid>
            <attribute name="product_id" type="primary" />
            <attribute name="category.name" type="dropdown" />
            <attribute name="title" format="text" />
            <attribute name="photo" format="file" />
            <attribute name="price" format="text" />
          </datagrid>
        </insert>
        <!-- Geef onder je invoervelden een overzicht van de laatste
10 ingevoegde berichten -->
        <import action="Overview" view="limit" />
      </action>
    </actions>
  </module>
</architecture>

Dit model is alles behalve perfect. Het is ook een eerste opzet en ik ben er van overtuigd dat er problemen zullen optreden. Het idee is dus dat dit bestand geparsed worden en dat aan de hand hiervan alle PHP code gegenereerd wordt als Base classes;

Bevat alle gegenereerde code:
class BaseOverviewProductAction {}
Extension waarin je de uitzonderingen kan programmeren:
class OverviewProductAction extends BaseOverviewProductAction {}


Schiet mij maar lek... :9

[ Voor 11% gewijzigd door Verwijderd op 04-07-2005 12:50 ]


Acties:
  • 0 Henk 'm!

Verwijderd

/me zegt uml

er zijn ook wel uml progsels die een java codeframe kunnen uitspugen (visual paradigm geloof ik), en ik zou het vreemd vinden als er ook al niet een xml representatie van uml bestaat eigenlijk

[ Voor 10% gewijzigd door Verwijderd op 04-07-2005 12:54 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
N.b. Ik probeer een framework te maken waarin je ook de View kan definieren. Frameworks die van een UML classestructuur code uitpoepen hebben vaak geen code voor de weergave. Ik redeneer: als je weet wat je wilt weergeven, dan weet je welke logica je moet uitvoeren.
Ik specificeer dus de View en aan de hand daarvan wil ik mijn Model en View templates opbouwen.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Is het misschien niet een idee om eens wat verder te kijken? Je loopt immers duidelijk tegen de grenzen van php aan. Waarschijnlijk is het voor jou tijd om eens te kijken wat de mogelijkheden van ASP.NET en/of J2EE zijn. De beperkingen waar jij tegenaan loopt zijn daar veel minder. Dit wordt opgevangen door een goede oop implementatie, grote aanwezigheid van goede, nette en ondersteunde frameworks en uitgebreide IDE's.

Verder is je idee helemaal niet zo slecht. Het problemen krijg echter wanneer je iets aanpast. Zodra je iets rechtstreeks aanpast (dus niet in je config vanwaaruit je je bestanden genereerd) kun je niks meer automatisch updaten.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Janoz schreef op maandag 04 juli 2005 @ 12:59:
...

Verder is je idee helemaal niet zo slecht. Het problemen krijg echter wanneer je iets aanpast. Zodra je iets rechtstreeks aanpast (dus niet in je config vanwaaruit je je bestanden genereerd) kun je niks meer automatisch updaten.
Daar is over nagedacht. De base classes krijgen de code die gegenereerd is en er wordt ook een normale class gemaakt die een extension is van de base class. Maak je wijzigingen in je specificatie en update je die, dan worden alleen je base classen overschreven. Je moet dus altijd zorgen dat je nooit in je base classes handwritten code gaat zetten.

// edit
Ik denk dat het niet echt van levensbelang is of ik dit nu in PHP, C# of Java implementeer. Ik wil alleen eens gaan nadenken over de mogelijkheden van een systeem waarbij je je View eenvoudig beschrijft, waarna alle code voor je gegenereerd wordt.

[ Voor 16% gewijzigd door Verwijderd op 04-07-2005 13:04 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Toen ik dit topic las, was mijn eerste gedachte als volgt;

Er zijn reeds vele programmeertalen op de markt. Wat doen programmeertalen? Die vertalen jouw code naar een voor de webserver te begrijpen code en geven je vervolgens een output terug. Oftewel, eigenlijk ben je bij het programmeren al aan het doen wat jij graag wilt: het gemakkelijker coden van voor de server te begrijpen instructies. Dat is één.

Twéé is dat programmeertaal al bijzonder lang bestaat in de vorm zoals we die nu kennen, OOP programmeren wellicht niet zolang maar dat terzijde. Denk je niet dat bedenkers, ontwikkelaars, van programmeertalen al nagedacht hébben over de makkelijkst te gebruiken code voor programmeurs? Ik denk van wel. Was dat niet het geval geweest, dan gingen de programmeurs allen gezamelijk zeuren over verbeteringen. Iets wat overigens al gebeurd op diverse fora van ontwikkelaars, maar niet in een mate dat er een conclusie kan worden getrokken dat het aansturen van parsers op een geheel andere manier moet gaan gebeuren - al dan niet tree-based á la XML, zoals jij suggereerd.

Ik denk dat iets als hetgeen jij voorstelt zeer zeker te maken is. Echter, ik denk dat het eindresultaat iets gaat zijn wat een taal op zich wordt. Misschien is taal het verkeerde woord, maar het in ieder geval een ontwikkelmethode an sich wordt. En bij nieuwe methodes moet je je altijd afvragen, net als bij bijvoorbeeld nieuwe CMS-systemen, of het makkelijk te leren is voor de gebruiker. In dit geval ben jij dat zelf, maar stel jezelf de vraag; kan ik er uiteindelijk écht makkelijker mee ontwikkelen, of wordt het dermate ingewikkeld (iets waar ik van overtuigd ben, kijk naar het voorbeeld van alleen al een simpel news-and-reaction systeem) dat het uiteindelijk geen nut meer heeft? En kan ik er zijpaden mee bewandelen indien noodzakelijk? Kan ik, in het geval van jouw voorbeeld, bijvoorbeeld gemakkelijk afbeeldingen toevoegen?

Succes gewenst overigens.

Edit; ik besef me net opeens dat je iets dergelijks alleen wilt maken om er code mee uit te spugen die je vervolgens kunt optimaliseren. Dan gaat het verhaal wellicht niet op. Toch denk ik dat je goed moet beseffen wat meer werk is: classes aanmaken e.d., of een tree-based file die uiteindelijk code uitspuugt die je alsnog moet aanpassen om het naar jouw hand te zetten.

[ Voor 13% gewijzigd door Verwijderd op 04-07-2005 13:12 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb inderdaad in mijn achterhoofd dat je specificatie niet dusdanig complex moet zijn, dat het langer duurt dan normaal programmeren. Echter: het opschrijven van de XML specificatie die ik heb gemaakt, werkt echt tien keer sneller dan het met de hand inkloppen. Daar komt bij dat ik dit lang niet zo saai vind en dat ik weet dat mensen zo'n specificatie eenvoudiger kunnen leren.
Denk je niet dat bedenkers, ontwikkelaars, van programmeertalen al nagedacht hébben over de makkelijkst te gebruiken code voor programmeurs?
Dit is echt ontzettend kortzichtig. Als iedereen zou denken zoals jij nu redeneert, dan komen er nooit verbeteringen en zal de technologie en kennis nooit groter worden; iedereen heeft er immers al over nagedacht... :)

// edit

Ik denk niet dat je helemaal snapt wat ik bedoel. Ik wil niet alleen de classes en namen uitspugen, maar alle code van het uitvoeren van DB queries tot het weergeven van de resultaten in verschillende Views. Je kan gewoon wiskundig bewijzen dat dit efficienter is. Namelijk: stel dat je met zo'n systeem al 60% van je code in een handomdraai kan genereren, dan hoef je nog maar 40% met de hand te doen. Zou je geen auto generatie gebruiken, dan moest je de code die nu autoamtisch gegenereerd is, alsnog met de hand inkloppen. Kortom: autogeneratie is altijd sneller, maar het heeft een beperkte dekking qua mogelijkheden. Maar hetgeen wat het kan, kan het vele malen efficienter dan 1 programmeur.

[ Voor 33% gewijzigd door Verwijderd op 04-07-2005 13:19 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb ditzelfde Idee maar dan met soort wizards die een xml maken die dan weer code maakt. Dit idee is opgezet in JAVA en bedoeld das een soort universeel CMS structuur. Ik ben hier met iemand een half jaar mee bezig geweest en de concepten zijn klaar, jammer genoeg belazerde die vent me en heb ik nu nog niks.

Acties:
  • 0 Henk 'm!

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
Ik had toevallig een maand terug ongeveer hetzelfde idee. Ik heb het deels uitgewerkt. Het ging als volgt: je maakte op voorhand een nette database en het script ging die uitlezen en daaruit classes genereren (het OR gedeelte dus) en views in elkaar steken met CRUD (op dezelfde manier als hierboven beschreven met een Base class die extended wordt). Dan kon je ook roles instellen en roles permissions geven (werd dan ook automagisch in die base classes ingevoerd). Zo had je na een database te maken al een volledig werkbaar 'ding'. Je moest enkel nog wat templates aanpassen (ik gebruik Smarty, dus ik gooi gewoon een hele zut data ernaartoe en de template ziet maar wat hij ermee aanvangt).

Noot: uiteraard is dit belange niet af, mede omdat ik ondertussen moest beginnen aan een nieuw project voor mijn werk, en ik zag het niet zitten deze tool af te ontwikkelen om hem daarvoor te gebruiken wegens tijdgebrek.

[ Voor 15% gewijzigd door dingstje op 04-07-2005 13:37 ]

If you can't beat them, try harder


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op maandag 04 juli 2005 @ 13:14:
Ik heb inderdaad in mijn achterhoofd dat je specificatie niet dusdanig complex moet zijn, dat het langer duurt dan normaal programmeren. Echter: het opschrijven van de XML specificatie die ik heb gemaakt, werkt echt tien keer sneller dan het met de hand inkloppen. Daar komt bij dat ik dit lang niet zo saai vind en dat ik weet dat mensen zo'n specificatie eenvoudiger kunnen leren.


[...]

Dit is echt ontzettend kortzichtig. Als iedereen zou denken zoals jij nu redeneert, dan komen er nooit verbeteringen en zal de technologie en kennis nooit groter worden; iedereen heeft er immers al over nagedacht... :)
Lees wel dat ik daarna heb geschreven dat er constant verbeteringen gesuggereerd worden en dat die vanzelfsprekend, kijk naar de versie-releases, ook doorgevoerd worden en dat een programmeertaal constant verbeterd wordt. Maar waar het mij om ging, is dat de basis zoals we die nu kennen al dermate gevorderd en geaccepteerd is dat die moeilijk weg te denken is.
// edit

Ik denk niet dat je helemaal snapt wat ik bedoel. Ik wil niet alleen de classes en namen uitspugen, maar alle code van het uitvoeren van DB queries tot het weergeven van de resultaten in verschillende Views. Je kan gewoon wiskundig bewijzen dat dit efficienter is. Namelijk: stel dat je met zo'n systeem al 60% van je code in een handomdraai kan genereren, dan hoef je nog maar 40% met de hand te doen. Zou je geen auto generatie gebruiken, dan moest je de code die nu autoamtisch gegenereerd is, alsnog met de hand inkloppen. Kortom: autogeneratie is altijd sneller, maar het heeft een beperkte dekking qua mogelijkheden. Maar hetgeen wat het kan, kan het vele malen efficienter dan 1 programmeur.
Besef wel, als je uitgaat van jouw 40/60% verhouding, dat je dan niet hebt meegenomen dat de XML-sheet nog gemaakt moet worden. De verhoudingen liggen dan anders.

Ik wil je idee ook niet direct van de kaart vegen, don't get me wrong, maar je moet de voordelen wel degelijk wegzetten ten opzichte van de nadelen en nogmaals, ik ben nog steeds ietwat bang dat dit niet heel veel voordeel op gaat leveren. Maar wie ben ik? Misschien ook wel, dat zul je uit moeten zoeken - iets waar je volgens mij al mee bezig bent ;-)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Die beschrijving voor het Overzicht en Invoegen van producten heb ik in 3 minuten in elkaar gezet. Het lukt mij *nooit* om in drie minuten alle werkende code te tikken voor die 2 acties. Daarom denk ik dus dat het wel voordelig moet zijn.
dingstje schreef op maandag 04 juli 2005 @ 13:36:
Ik had toevallig een maand terug ongeveer hetzelfde idee. Ik heb het deels uitgewerkt. Het ging als volgt: je maakte op voorhand een nette database en het script ging die uitlezen en daaruit classes genereren (het OR gedeelte dus) en views in elkaar steken met CRUD (op dezelfde manier als hierboven beschreven met een Base class die extended wordt). Dan kon je ook roles instellen en roles permissions geven (werd dan ook automagisch in die base classes ingevoerd). Zo had je na een database te maken al een volledig werkbaar 'ding'. ...
CRUD klinkt Interessant, ga ik mij eens in verdiepen...

Acties:
  • 0 Henk 'm!

  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 20-09 21:57

JaWi

maak het maar stuk hoor...

Ik denk dat je eens op "MDA", oftewel "Model Driven Architecture" moet zoeken. Dit is een paradigma wat met abstracties en/of verfijningen meer koppeling tussen modellen en code wil bewerkstelligen. Met andere woorden: je maakt een maakt een model van je applicatie m.b.v. een MDA-tool, verteld deze tool dat er PHP code-model uit het originele model gemaakt moet worden en hop, je PHP code wordt gegenereerd. Een prachtig idee, de realiteit is wat minder rooskleurig: voor zover ik weet is er geen enkele tool wat het MDA principe op PHP loslaat (er zijn wel een handjevol die C/C++ en Java ondersteunen)...

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.

Pagina: 1