Kan je niet veel beter die methodes in een abstracte class zetten en daarvan laten inheriten?quote:Op zaterdag 9 augustus 2008 12:17 schreef StonedKinG het volgende:
Ik ben momenteel bezig met een ASP/NET / C# Generator, die op basis van een tabel in een DBMS een C# class genereert, en bijbhorende usercontrols. Volgende methoden worden gegenereerd :
public static Blaat load(keys)
public static Blaat save(keys)
public static Blaat[] loadall(keys)
public static Blaat[] lfind(string searchString, string Column)
public Control[] getControlFor(string column);
Op deze manier kun je heel makkelijk (zeker als je geen LINQ oid kunt/wilt gebruiken) een tabel converteren naar een pagina om dit object te maken. Een Bit worden 2 radio buttons, een blob wordt een upload veld, als een kolom verplicht is komt er automatisch een RequiredFieldValidator op, etc....
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | using System; namespace maral.db.obj { ///////////////////////////////////////////////// // Class generated by Maral DbClassCreator V2.0// // Created for: ASP.NET 2.0 ///////////////////// ///////////////////////////////////////////////// public class News { public string content { get; set; } public DateTime date { get; set; } public string author { get; set; } public int id { get; set; } /// <summary> /// Constructs a new News object. Nullable fields are <code>null</code>, other are getting a default value suchs as -1L for <code>long</code>s. /// </summary> public News() { id = -1; } public static News load(int key_id) { var result = new News(); var reader = DbTools.getOleDataReader("SELECT * FROM News WHERE id = " + key_id); while (reader.Read()) { result.content = DbTools.getString(reader["content"]); result.date = DbTools.getDate(reader["date"]); result.author = DbTools.getString(reader["author"]); result.id = DbTools.getInt(reader["id"]); } reader.Close(); return result; } public void save() { var newRecord = id > 0; var query = newRecord ? "INSERT INTO News VALUES(@content, @date, @author);" : "UPDATE News SET content = @content, date = @date, author = @author WHERE id = @id;"; var command = DbTools.getOleCommand(query); try { if (!newRecord) command.Parameters.AddWithValue("@id", id); command.Parameters.AddWithValue("@content", content); command.Parameters.AddWithValue("@date", date); command.Parameters.AddWithValue("@author", author); if (newRecord) id = int.Parse(command.ExecuteScalar().ToString()); else command.ExecuteNonQuery(); } catch (Exception e) { //TODO: Log error! } finally { command.Connection.Close(); } } public static News[] loadAll() { var reader = DbTools.getOleDataReader("SELECT * FROM News;"); var amount = 0; while (reader.Read()) { amount++; } reader.Close(); reader = DbTools.getOleDataReader("SELECT * FROM News;"); var result = new News[amount]; var i = 0; while (reader.Read()) { result[i] = new News(); result[i].content = DbTools.getString(reader["content"]); result[i].date = DbTools.getDate(reader["date"]); result[i].author = DbTools.getString(reader["author"]); result[i].id = DbTools.getInt(reader["id"]); i++; } reader.Close(); return result; } public static News[] find(string searchString, string columnName) { var reader = DbTools.getOleDataReader("SELECT * FROM News WHERE " + columnName + " LIKE '%" + searchString + "%';"); var amount = 0; while (reader.Read()) { amount++; } reader.Close(); reader = DbTools.getOleDataReader("SELECT * FROM News WHERE " + columnName + " LIKE '%" + searchString + "%';"); var result = new News[amount]; var i = 0; while (reader.Read()) { result[i] = new News(); result[i].content = DbTools.getString(reader["content"]); result[i].date = DbTools.getDate(reader["date"]); result[i].author = DbTools.getString(reader["author"]); result[i].id = DbTools.getInt(reader["id"]); i++; } reader.Close(); return result; } public static void delete(int key_id) { var command = DbTools.getOleCommand("DELETE FROM News WHERE id = " + key_id); command.ExecuteNonQuery(); } } } |
Houd je wel aan de coding conventiesquote:Op zaterdag 9 augustus 2008 12:17 schreef StonedKinG het volgende:
Ik ben momenteel bezig met een ASP/NET / C# Generator, die op basis van een tabel in een DBMS een C# class genereert, en bijbhorende usercontrols. Volgende methoden worden gegenereerd :
public static Blaat load(keys)
public static Blaat save(keys)
public static Blaat[] loadall(keys)
public static Blaat[] lfind(string searchString, string Column)
public Control[] getControlFor(string column);
Op deze manier kun je heel makkelijk (zeker als je geen LINQ oid kunt/wilt gebruiken) een tabel converteren naar een pagina om dit object te maken. Een Bit worden 2 radio buttons, een blob wordt een upload veld, als een kolom verplicht is komt er automatisch een RequiredFieldValidator op, etc....
Ik heb een tijd geleden zoiets gemaakt maar dan in perl: DataRow. Dat is een generieke abstracte class die een row uit een willekeurige databasetabel representeert, met load, save, delete, copy etc methods, generieke voorzieningen voor 1-to-many, 1-to-1 en many-to-many relaties. Die class is relatief groot, maar in subclasses inherit je dan daarvan, en daarin geef je alleen aan wat de databasetabel is, welke velden die tabel heeft, je definieert de identificerende key(s) en je definieert de relaties die het object met andere subclasses heeft. Hierdoor blijven de subclasses heel klein, in principe hoef je dan niet meer dan de constructor te overriden. Dat scheelt heel veel herhaling van grotendeels identieke code; en dat is belangrijk, als je dan iets wil wijzigen hoeft dat maar in 1 bestand, al je subclasses nemen dat vanzelf over, en hoef je ook geen generator aan te passen. Ik geloof sowieso niet in code die code genereert eigenlijk, vragen om problemen is dat.quote:Op zaterdag 9 augustus 2008 13:39 schreef StonedKinG het volgende:
Dat zou kunnen, allen per tabel verschilt alles wel zo veel dat het weinig zin heeftdan zou ik meer op een interface terecht komen. Daarbij verschilt de signature nogal eens van zo''n methode, de load heeft namelijk bij een enkele sleutel slechts 1 parameter, bij meerdere natuurlijk meer
Hier een voorbeeltje van zo'n gegenereerde class, kan nog wat foutjes bevatten maar schiet al lekker op
[ code verwijderd ]
Alles is dus gegenereerd, dus ook het commentaar
Wat bedoel je met een meer lagen model? Het gebruik van interfaces/abstrace klassen etc? De null value afhandeling doe ik door velden die verplicht zijn in de DB een standaard waarde te geven als -1, of een nieuwe instantie van bv DateTime en niet verplichte velden gaan straks weer de db in als een Db.NullValue indien ze hun standaardwaarde hebben of een null zijn.quote:Op zaterdag 9 augustus 2008 14:51 schreef existenz het volgende:
[..]
Houd je wel aan de coding conventies. Is zeker bij generators belangrijk om te doen. En let ff op null value afhandeling en ik zie dat je geen meer lagen model gebruikt. Is dat expres (Kan natuurlijk prima als je daarvoor kiest)?
Dat was ook mijn doel, het af zijn van innerline SQL, die eeuwige readers, vergeten connecties te sluiten, etc. Of je gelooft in code generatie hangt puur af hoe intelligent je je generator maakt. Tot nu toe ben ik geen serieuze problemen tegen gekomen.quote:Op zaterdag 9 augustus 2008 16:42 schreef Farenji het volgende:
[..]
Ik heb een tijd geleden zoiets gemaakt maar dan in perl: DataRow. Dat is een generieke abstracte class die een row uit een willekeurige databasetabel representeert, met load, save, delete, copy etc methods, generieke voorzieningen voor 1-to-many, 1-to-1 en many-to-many relaties. Die class is relatief groot, maar in subclasses inherit je dan daarvan, en daarin geef je alleen aan wat de databasetabel is, welke velden die tabel heeft, je definieert de identificerende key(s) en je definieert de relaties die het object met andere subclasses heeft. Hierdoor blijven de subclasses heel klein, in principe hoef je dan niet meer dan de constructor te overriden. Dat scheelt heel veel herhaling van grotendeels identieke code; en dat is belangrijk, als je dan iets wil wijzigen hoeft dat maar in 1 bestand, al je subclasses nemen dat vanzelf over, en hoef je ook geen generator aan te passen. Ik geloof sowieso niet in code die code genereert eigenlijk, vragen om problemen is dat.
Deze DataRow class gebruik ik tegenwoordig in bijna al mijn perl projecten. Scheelt echt veel tijd, development is nog nooit zo snel gegaan, je hebt vrijwel geen inline SQL meer nodig en je code wordt er ongelooflijk compact en overzichtelijk van.
In perl zijn er veel van dit soort classes, zoals DBIx::Class waar nog veel meer mee kan. Veel frameworks in andere talen zoals phpCake of Ruby on Rails hebben een vergelijkbare class, hoogstwaarschijnlijk is er voor .NET ook wel zoiets te vinden.
Volgens de meeste gebruikte conventie zou je het als volgt doen:quote:Op zaterdag 9 augustus 2008 19:48 schreef StonedKinG het volgende:
[..]
Wat bedoel je met een meer lagen model? Het gebruik van interfaces/abstrace klassen etc? De null value afhandeling doe ik door velden die verplicht zijn in de DB een standaard waarde te geven als -1, of een nieuwe instantie van bv DateTime en niet verplichte velden gaan straks weer de db in als een Db.NullValue indien ze hun standaardwaarde hebben of een null zijn.
Wat bedoel je met coding conventies? Zie ik iets over het hoofd? Ik laat elke klasse sowieso checken door Resharper 4, en zorg dat ik niet eens warnings genereer
1 2 3 4 5 6 7 8 9 10 | public string ExampleProperty { get { return exampleProperty; } set { exampleProperty = value; } } public void Save() { } |
Thx voor die uppercasequote:Op zaterdag 9 augustus 2008 20:04 schreef existenz het volgende:
[..]
Volgens de meeste gebruikte conventie zou je het als volgt doen:
[ code verwijderd ]
Methode names dus altijd met uppercase beginnen en public fields private omturnen in properties. Dat viel me eigenlijk vooral op. Dat is ieg de meest gebruikte standaard (Maar absoluut niet de enige).
edit: Ik zie 3.5 gebruikt worden, dan hoeft de private declarie niet, maar ook de properties met hoofdletter beginnen
Omdat je soms niet van een bepaalde technologie kunt gebruiken door een dwarsliggende webhost, oude meuk, of simpelweg omdat het ff snel genereren van de hele zooi voor een klein projectje gewoon fijn is. Daarbij genereert Linq To SQL en die andere meuk toch geen ASP.NET pagina's? Zeker niet netjes met RequiredFieldValidators enzo toch ?quote:edit2:
Waarom trouwens zelfs wat schrijven als je NHibernate, ActiveRecord, WIlson, LLBGen, Linq To Sql, Entity Framework etc hebt?
Vandaar het keuzerondequote:Op zaterdag 9 augustus 2008 20:21 schreef existenz het volgende:
Nee, dat klopt (LLBLGen volgens mij wel, maar die kost dan ook $$$). Dit soort properties (waar je geen fields hoeft te declareren) bestaan trouwens pas sinds .NET 3.5
Waarom heb je er voor gekozen om de methods static te maken?quote:
Was mij inderdaad nog niet opgevallen. Het is inderdaad niet gebruikelijk, maar kan prima. Probleem is alleen dat wanneer je dan specifieke methodes die statefull zijn voor een class krijgt je instance methods en statics gaat mixen.quote:Op zondag 10 augustus 2008 14:19 schreef rekenwonder het volgende:
[..]
Waarom heb je er voor gekozen om de methods static te maken?
Als een methode static kan zijn, waarom zou je het dan niet doen? Persoonlijk vind ik het handiger als ik var blaat = Blaat.load(dinges) kan doen dan dat ik var blaat = new Blaat(); blaat.load(dinges); moet doen. Sowieso was bij de meeste bedrijven en stages waar ik gelopen heb het gebruikelijk om een methode static te maken indien mogelijk... Net zoals private indien niet public nodig, en final (java) of fixed variabeles waar mogelijk.quote:Op zondag 10 augustus 2008 14:27 schreef existenz het volgende:
[..]
Was mij inderdaad nog niet opgevallen. Het is inderdaad niet gebruikelijk, maar kan prima. Probleem is alleen dat wanneer je dan specifieke methodes die statefull zijn voor een class krijgt je instance methods en statics gaat mixen.
Je weet dat k's niets zegt over een goed programmaquote:Op zondag 10 augustus 2008 14:35 schreef PiRANiA het volgende:
Ik ben nu bezig met een crawler om een lijst domeinnamen te verkrijgen voor een project van me (php cli ftw).
Heb er inmiddels 19k
Vanuit de bedrijven waar ik werk (Ik doe detachering) is static niet echt gebruikelijk om iets static te maken omdat het kan. Het moet echt een reden en voordeel hebben, statics zijn namelijk niet statefull, vele malen minder flexibel etc. Ik heb al te vaak applicaties moeten "destaticen", omdat er aanpassingen gedaan moesten worden of state problemen waren, waar de mensen niet uit kwamen.quote:Op zondag 10 augustus 2008 22:47 schreef StonedKinG het volgende:
[..]
Als een methode static kan zijn, waarom zou je het dan niet doen? Persoonlijk vind ik het handiger als ik var blaat = Blaat.load(dinges) kan doen dan dat ik var blaat = new Blaat(); blaat.load(dinges); moet doen. Sowieso was bij de meeste bedrijven en stages waar ik gelopen heb het gebruikelijk om een methode static te maken indien mogelijk... Net zoals private indien niet public nodig, en final (java) of fixed variabeles waar mogelijk.
Nja ik gebruik static ook eigelijk alleen maar bij van die "tool" methoden, zoals een bepaald algoritme uitvoeren op iets, of zoals nu een simpel objectje laden ofzo. Voordeel van static methoden vind ik vooral dat je ze makkelijk in andere software kunt gebruiken. Gaat dus inderdaad vaak om helper methods.quote:Op zondag 10 augustus 2008 22:59 schreef existenz het volgende:
[..]
Vanuit de bedrijven waar ik werk (Ik doe detachering) is static niet echt gebruikelijk om iets static te maken omdat het kan. Het moet echt een reden en voordeel hebben, statics zijn namelijk niet statefull, vele malen minder flexibel etc. Ik heb al te vaak applicaties moeten "destaticen", omdat er aanpassingen gedaan moesten worden of state problemen waren, waar de mensen niet uit kwamen.
Het is niet slecht, maar je moet wel verdomd goed opletten wat je aan het doen bent. Voordat je het weet is je hele applicatie static en dat geeft 100% zeker problemen.
Zelfde soort probleem als mij dusquote:Op maandag 11 augustus 2008 08:38 schreef Slarioux het volgende:
Krijg foutmeldingen bij de Whatpulse topic. Server geeft een 500 error, maar nergens een fout te bekennen. Straks maar eens naar een file gaan loggen.
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |