Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2011-01-30, 20:26
  #1
Medlem
z0mfg(ish)s avatar
Hej alla!

Jag skapade en tråd för länge sedan som heter OOP-leken: Dags att lära oss OOP!, men den tog aldrig riktigt fart, så istället tänkte jag att vi startar på ny kula och har ett ordentligt projekt att jobba med.

Vem som helst får självklart hoppa in - om det så gäller att skriva en enskild funktion, skapa en hel klass eller kanske bara tipsa om saker.
Tanken är att andra ska ta del av koden, samtidigt som man skriver om vad man gör, hur man gör det och varför här i tråden, så att andra kan lära sig.

Jag tänkte att första projektet ska bli en sida med böcker - typ en bokhandel. Men vi kan börja med det grundläggande för att sedan bygga på. Detta är ju dessutom kraftfullheten med OOP, att man inte skriver spaghettikod gör att man enkelt kan lägga till nya funktioner utan att behöva skriva om milslånga skript.

Vad behövs då?

Vi börjar med en databas.
En tabell som håller i alla böcker. Varje bok har självklart ett unikt ID, men jag tycker att man även ska använda ISBN-nummer. Med hjälp av detta kanske man senare kan hämta information beroende på ISBN vid inregistrering av en ny bok - så att man sparar tid vid inregistrering.

Vi bör även komma överens om en namnstandard, när det gäller tabeller (och självklart på klasser och metoder). Mitt förslag till tabellnamn är att varje tabell ska hantera ett objekt, som då får objektets namn i plural. Varje fält har sedan objektets namn i singular följt av vad fältet ska innehålla. Dessutom ska allt vara på engelska.

Kod:
--- tabell "books" ---
bookID
publisherID
bookISBN10
bookISBN13
bookName
bookWriter
bookTranslator
bookDesigner (formgivare, mer passande ord?)
bookLanguage
bookYear     (utgivningsdatum)
bookMonth   (utgivningsdatum)
bookDay      (utgivningsdatum)
bookEdition  (utgåva, upplaga)
bookPages

--- tabell "publishers" ---
publisherID
publisherName
publisherCountry

Inget är ju skrivet i sten, men det där kan vara grunden. Nu har man möjlighet att lägga in böcker i databasen för att kunna skriva ut dem på hemsidan.

Vad behöver vi då i PHP-väg?

Vi börjar med ett database abstraction layer (Googla om ni inte känner till det). Att hoppa direkt på ett ORM kanske känns onödigt. Detta grundas helst på MySQLi, för att det är säkrare.
Tanken är att man enbart ska extenda klasser till databas-klassen och använda uppkopplingen direkt i metoder - inte på något annat sätt (d.v.s. inte kladda ner "viewen" med databaskopplingar).
Denna ska ha en construct och en destruct. Server, användarnamn osv tar vi helst från en global konfiguration, som ligger separat från klassbiblioteket. Utöver det måste man kunna skicka SQL-frågor.
Men mot MySQLi kan man göra det på olika sätt - prepared statements, multi query etc (för olika ändamål). Hur man ska lösa detta kan vi komma fram till i tråden.

Efter det behöver vi en klass som hanterar böckerna.
Förstås en "getBook" och en "setBook", där "getBook" hämtar ut en specifik bok och setBook hanterar inregistrering. En "listBooks" kan vara på sin plats.


Mer än så tycker inte jag vi behöver börja med. Får vi detta att fungera bra, optimerar vi allt och får det att fungera ännu bättre. Sen går vi vidare, med kanske en kundkorg, så att man kan lägga ner saker i kundkorgen.
Efter det en sätt att skicka beställningar - och förstås en tillhörande adminpanel där man kan hantera böcker, beställningar osv. Förvisso behövs adminpanelen för att registrera in böcker från första början, så det ska vara med!

Ja som ni ser är det mycket man ska tänka på när man bygger i stor skala - och det här är ändå inget jätteprojekt (hittills).

Vi börjar med att planera så mycket som möjligt, får fram något slags "regelverk" för hur uppdateringar osv ska ske. Kanske använda något slags versionshanteringssystem.

Spåna på!
Citera
2011-01-30, 22:12
  #2
Medlem
jonthe12s avatar
Låter som en kul ide! Men hur ska det organiseras?

Ska varje deltagare köra på sin egna server?
- Tycker det skulle vara skönare om någon kunde erbjuda sig att hosta en ftp, http och mysql server med förslagsvis phpmyadmin. Möjligt att jag kan ordna det, 10 mbit upp men det blir dock på en halvbra netbook.

Ska alla skriva all kod själv (och sen röstar vi om bästa) eller ska vi alla jobba på samma kod direkt?
Tycker personligen andra alternativet blir bäst, mindre jobb och mer samarbete

När allt det är klart kan man kanske börja med lite regler.. Hur metoder, klasser, variablar ska namnges och hur kommentarer ska skrivas osv.

Första klassen kanske skulle vara nån slags htmlparser. Så vi kan ta information direkt från t ex adlibris.se. Den data som samlats in kan sedan visas på någon adminsida, ev. redigeras och godkännas.

Så det är lite av mina funderingar. Är väldigt ringrostig när det gäller webbutveckling men får väl slänga upp gamla OOP-boken och börja läsa lite =) Sånt här är riktigt kul när det är strukturerat
__________________
Senast redigerad av jonthe12 2011-01-30 kl. 22:21.
Citera
2011-01-31, 01:55
  #3
Medlem
Jag skriver gärna lite kod sen, kan hända att man lär sig något nytt.
Citera
2011-01-31, 14:53
  #4
Medlem
z0mfg(ish)s avatar
Låter bra att några har snappat upp det i alla fall!
Jag tycker vi börjar med databasen, för den blir ju grunden till hemsidan. Efter det börjar vi mecka PHP.

Mitt förslag ovan, duger det tycker ni?
Först namnstandard, tabellnamn är objektet i plural och fältnamn är objektet i singular med fältbeskrivning efteråt.

Kom på att vi ska ha en tabell som heter "categories" också (så att man kan kategorisera böcker):
Kod:
--- tabell "categories" ---

categoryID
categoryName
Spontant känner jag att den inte behöver något mer.

Och så lägger vi förstås till ett fält i tabellen "books" som heter "categoryID".


Jag tycker att alla kör så uppdaterad installation hemma som möjligt, lokalt, där man utvecklar och testar. Detta sätter vi ihop på någon server sen som man får tillgång till - vem som nu kan bidra med den får vi se. Ingen omöjlighet att jag kan lägga ner en slant och betala för webhotell.
Man behöver inte ha exakt samma version förstås, men det är dumt om någon sitter med PHP4 medan resten kör PHP5.

Själv kör jag WAMP, med följande konfiguration:
Apache Version: 2.2.17
PHP Version: 5.3.3
MySQL Version: 5.5.8

Kom gärna med input på databasstrukturen, så börjar vi där.
Citera
2011-01-31, 14:57
  #5
Medlem
Tvillingens avatar
Är det inte bara att alla kör via github som vi gjorde med "Flashbacks-PHP-projekt"?

https://github.com/oleander/Flashbacks-PHP-projekt

Får se om jag hänger på, men jag tycker ni borde köra via github eller någon annan lösning som är lätt att hantera.
Citera
2011-01-31, 15:26
  #6
Medlem
DigGaNs avatar
Citat:
Ursprungligen postat av z0mfg(ish)
Detta sätter vi ihop på någon server sen som man får tillgång till - vem som nu kan bidra med den får vi se. Ingen omöjlighet att jag kan lägga ner en slant och betala för webhotell.
Man behöver inte ha exakt samma version förstås, men det är dumt om någon sitter med PHP4 medan resten kör PHP5.

Kan bidra med domän och webbhotell som en vän äger och har över.

Citat:
Ursprungligen postat av Tvillingen
Är det inte bara att alla kör via github som vi gjorde med "Flashbacks-PHP-projekt"?

https://github.com/oleander/Flashbacks-PHP-projekt

Får se om jag hänger på, men jag tycker ni borde köra via github eller någon annan lösning som är lätt att hantera.

Någon versionshanterare är ju nästan ett krav...
Citera
2011-01-31, 15:35
  #7
Medlem
z0mfg(ish)s avatar
Citat:
Ursprungligen postat av DigGaN
Kan bidra med domän och webbhotell som en vän äger och har över.
'tis awsum.
Citat:
Ursprungligen postat av DigGaN
Någon versionshanterare är ju nästan ett krav...
Och ja, vi behöver förstås någon slags versionshantering. Krångligt om vi ska göra det helt manuellt, då kommer något att fela. Men att installera något på servern alt. använda något annat system känns väldigt nödvändigt, så att flera personer kan jobba på samma funktioner i olika skeden.

Jag är grön på just denna biten, så om någon har tips får ni gärna komma med det.
Citera
2011-01-31, 19:48
  #8
Medlem
jonthe12s avatar
Citat:
Ursprungligen postat av z0mfg(ish)

Kom gärna med input på databasstrukturen, så börjar vi där.

Om vi sen ska ha kundvagn så bör man väl ha bookPrice också
Kanske också bookImage för bokomslag, finns ju förstås alternativ också, t ex namnge bilder efter isbn/id/etc
Citera
2011-01-31, 20:34
  #9
Medlem
z0mfg(ish)s avatar
BookPrice är nödvändig då förstås, bra förslag!

Ang. bilder, skulle man inte kunna ha en tabell med bilderna (URL till filen, som sedan hämtas av ett skript), som sedan har bookID, så att man kan ha n bilder per bok?
Citera
2011-01-31, 20:50
  #10
Medlem
economuss avatar
Sitter just nu och bygger en basklass för databasrader som implementerar active recordsmönstret. Eller rättare sagt, något åt det hållet. Jag tänker inte vara med på detta, men kommer att hålla ögonen på tråden. Vi får se om jag har något vettigt att tillägga Det finns ju annars andra sätt att bygga databasabstraktion. Ta en titt på Table Data Gateway, t.ex.
Citera
2011-01-31, 21:34
  #11
Medlem
Citat:
Ursprungligen postat av z0mfg(ish)
Kom gärna med input på databasstrukturen, så börjar vi där.

Jag gillar inte att du har prefix på varje attribut, blir onödigt att hämta bookName FROM books exempelvis tycker jag. Och krockar kan undvikas genom att skriva "books.name". Annat jag tänkte på är att du har antagit 1-1 förhållande mellan flera saker som inte behöver vara detta. Tänker framförallt på: bookWriter, bookTranslator, bookDesigner. Som det är nu blir det redundans också, om två böcker med samma författare skall läggas in. Onödigt att dela upp datum också, bookYear, bookMonth och bookDay bör ersättas med ett attribut "published" eller "bookPublished" exempelvis.

Mitt förslag:

books(id, publisher_id, isbn10, isbn13, name, price, language, published, pages);
authors(id, firstname, surname);
translators(id, firstname, surname);
designers(id, firstname, surname);

books_authors(book_id, author_id);
books_designers(book_id, author_id);
books_translators(book_id, author_id);

publishers(id, name, country);
__________________
Senast redigerad av NilsNilsson321 2011-01-31 kl. 21:36.
Citera
2011-01-31, 22:00
  #12
Medlem
jonthe12s avatar
Citat:
Ursprungligen postat av NilsNilsson321
Mitt förslag:

books(id, publisher_id, isbn10, isbn13, name, price, language, published, pages);
authors(id, firstname, surname);
translators(id, firstname, surname);
designers(id, firstname, surname);

books_authors(book_id, author_id);
books_designers(book_id, author_id);
books_translators(book_id, author_id);

publishers(id, name, country);

Håller med om att vi bör ha en tabell för författare och binda ihop böcker med id'n istället.

Angående datum kan det ju vara flexibelt att spara datumet i year, month, day. Säg att man vill ta ut ett visst antal böcker, släppta en viss månad eller ett visst år. Blir lättare att konstruera queryn. (dock inge vidare på SQL)


Citat:
Ursprungligen postat av z0mfg(ish)
Ang. bilder, skulle man inte kunna ha en tabell med bilderna (URL till filen, som sedan hämtas av ett skript), som sedan har bookID, så att man kan ha n bilder per bok?

Mycket bättre
__________________
Senast redigerad av jonthe12 2011-01-31 kl. 22:03.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback