php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 18.06.2009, 22:56  
Benutzer
 
Registriert seit: 18.06.2009
Beiträge: 42
PHP-Kenntnisse:
Fortgeschritten
Leichti befindet sich auf einem aufstrebenden Ast
Standard Suche Hilfe [Tipps] für professionelles Software-Design

Guten Abend!
Ich bin Hobby-Entwickler eines Browsergames (Link gerne per PM). Das Projekt läuft mittlerweile auch ganz gut, es sind rund 400 aktive Spieler registriert. Doch leider habe ich das Browsergame nicht wirklich objektorientert geschrieben. Zwar hab ich alles in Klassen eingeteilt, aber ich hab glaub ich meinen eigenen Stil entwickelt..

Kurze Erklärung:
Ich hab die Funktion __autoload() mishandelt, habe verschiedene Klassen angelegt, in verschiedenen Ordnern (nach Funktion), beispielweise "klassen" und "templates". Funktionen werden zu 99% statisch aufgerufen...

Auszug meiner __autoload Funktion.
PHP-Code:
function __autoload($name) {        
    if(
file_exists("klassen/".$name.".class.php"))
        require_once(
"klassen/".$name.".class.php");
        
    elseif(
file_exists("templates/klassen/".$name.".php"))
        require_once(
"templates/klassen/".$name.".php");

    elseif(
file_exists("templates/admin/klassen/".$name.".class.php"))
        require_once(
"templates/admin/klassen/".$name.".class.php");        

    elseif(
file_exists("../klassen/".$name.".class.php")) 
        require_once(
"../klassen/".$name.".class.php");
    
    elseif(
file_exists("klassen/admin/".$name.".class.php")) {
        require_once(
"klassen/admin/".$name.".class.php");    
    }
    

Beispiel: Hier berechnet sich der Gesamtwert von angelegtem Geld in der Klasse "bank".
PHP-Code:
    public function give_anlagen_gesamt_wert($user_id) {
        if(!
$anlagenwert self::read_anlage_from_user($user_id))
            return 
false;        

        foreach(
$anlagenwert as $value) {
            @
$gesamtanlage += $value["anlage"];
        }
        
        return 
$gesamtanlage;
    
    } 
Beispiel für das Auflösen einer Anlage
PHP-Code:
    public function lose_anlage_auf($anlage_id$user_id) {
    
        if(!
$anlage self::check_if_own_anlage($anlage_id$user_id))
            return 
false;
            
        
update::update_money_add($user_id$anlage["anlage"]);
        
kontoauszug::write_kontoauszug($anlage["anlage"], "Vorzeitiges Auflösen einer ihrer Anlagen an der Bank"""$user_id);
        
delete::delete_one_anlage($anlage["id"]);
        
        return 
true;
    } 
Ich denke man sieht schon wie das funktioniert.. Was haltet ihr davon?



So nun aber zu meiner eigentlichen Frage:
Wie würdet ihr Programmcode für große Projekte aufbauen? Ich hab mir jetzt mal ein Buch (Professionelle PHP 5-Programmierung: Entwicklerleitfaden für große Webprojekte mit PHP 5: Amazon.de: George Schlossnagle: Bücher) bestellt, was haltet ihr von dem? Ich hoffe damit etwas mehr über oop zu erfahren.. Ich hab mir auch ein wenig den Source von der Foren-Software myBB bzw smf angeguckt.. Hab nun auch schonmal ein wenig angefangen mir eine eigene Klasse für mysql-Abfragen zu gestalten..
PHP-Code:
class MySQL_DB {

public 
$host;
public 
$user;
public 
$passwort;
public 
$datenbank;

public 
$handle_db/* Mysql_connect gibt eine information in diese variable */
public $handle_tb;
    
public 
$querys;
public 
$error;


public function 
__construct($host$user$passwort$datenbank
{
    
$this->host $host;
    
$this->user $user;
    
$this->passwort $passwort;
    
$this->datenbank $datenbank;
    
        if(!
$this->handle_db = @mysql_connect($host$user$passwort)) 
        {
            
$this->error[] = "Keine Verbindung zum Server möglich, bitte überprüfen Sie die Angaben";
            return;
        }
        if(!
$this->handle_tb = @mysql_select_db($datenbank)) {
        
            
$this->error[] = "Verbindung zur Datenbank {$datenbank} nicht möglich";
            return;
        }
}

}

$db = new MySQL_DB("localost""root""root""test2"); 
Ich hab zwar irgendwie Vorstellungen, aber ich weis nicht wie es professionell sprich gut erweiterbar und eventuell mit mehreren Personen entwickelbar gemacht wird? Ich hoffe einfach dass mir jemand ein überschaubares Beispiel zeigen kann (So bis 1000 Zeilen Code)! Oder mir etwas erklären kann, zum Thema Éntwurfsmuster.. Ich hab davon keinen Plan und verstehe es nicht wirklich..

PS: Ich kann keine andere Programmiersprache, also kein JAVA, C oÄ


mfg und Danke schonmal, leichti
Leichti ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 19.06.2009, 06:40  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.733
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Ich greife mir mal einen Aspekt heraus.

Edit: Ich denke, in MVC-Begriffen wäre das hier alles Model.

Objektorientierung versucht unter anderem, die "Wirklichkeit" nachzubauen.

Es gibt einen Spieler, der hat einen Bankaccount. In diesem Account ist unter anderem eine Liste von Anlagen verzeichnet.

Wenn nun auf eine bestimmte Anlage eines Spielers zugegriffen werden soll, geschieht anschaulich folgendes:

PHP-Code:
$bankAccount $player->getBankAccount();
$investmentList $bankAccount->getInvestmentList();
$investment $investmentList->getInvestmentByIndex(2);
echo 
$investment->getTitle(); 
Umgekehrt kann es sinnvoll sein, den Eigentümer einer Anlage zu ermitteln:

PHP-Code:
$investmentList $investment->getInvestmentList();
$bankAccount $investmentList->getBankAccount();
$player $bankAccount->getOwner();
echo 
$player->getName(); 
Jedes Objekt kennt also genau sein "logisches Umfeld", nicht mehr. Eine Anlage gehört in engster Beziehung nicht zu einem Spieler, sondern zu einem Portfolio von Anlagen. Das gehört wiederum zu einem Bankaccount und der gehört schließlich einem Spieler.

Ich habe mal versucht, das in Code zu gießen (wollte das Iterator-Interface ausprobieren ). An dem Beispiel wird glaube ich schön ersichtlich, dass es nicht unbedingt einfach ist, eine günstige Objektstruktur zu bauen.

PHP-Code:
<?php

class Bank_Investment
{
    protected 
$_value;
    protected 
$_title;
    protected 
$_investmentList;

    public function 
__construct($title$valueBank_InvestmentList $investmentList)
    {
        
$this->_title $title;
        
$this->_value $value;
        
$this->_investmentList $investmentList;
    }

    public function 
getValue()
    {
        return 
$this->_value;
    }

    public function 
getTitle()
    {
        return 
$this->_title;
    }

    public function 
getInvestmentList()
    {
        return 
$this->_investmentList;
    }
}

class 
Bank_InvestmentList implements Iterator
{
    protected 
$_position;
    protected 
$_investments;
    protected 
$_account;

    public function 
__construct(Bank_Account $account)
    {
        
$this->_account $account;
        
$this->_position 0;
        
$this->_investments = array();
    }

    public function 
getTotalValue()
    {
        
$total 0;
        
$count count($this->_investments);
        for (
$i 0$i $count$i++)
        {
            
$total += $this->_investments[$i]->getValue();
        }
        return 
$total;
    }

    public function 
getBankAccount()
    {
        return 
$this->_account;
    }

    public function 
getNumberOfInvestments()
    {
        return 
count($this->_investments);
    }

    public function 
getInvestmentByIndex($i)
    {
        return (isset(
$this->_investments[$i])) ? $this->_investments[$i] : null;
    }

    public function 
addInvestment($title$value)
    {
        
$investment = new Bank_Investment($title$value$this);
        
$this->_investments[] = $investment;
    }

    
/* Iterator-Interface (notwendig, um foreach nutzen zu können) */
    
public function current()
    {
        return 
$this->_investments[$this->_position];
    }

    public function 
key()
    {
        return 
$this->_position;
    }

    public function 
next()
    {
        
$this->_position++;
    }

    public function 
rewind()
    {
        
$this->_position 0;
    }

    public function 
valid()
    {
        return isset(
$this->_investments[$this->_position]);
    }
}

class 
Bank_Account
{
    protected 
$_owner;
    protected 
$_investments;

    public function 
__construct(Player $owner)
    {
        
$this->_owner $owner;
        
$this->_investments = new Bank_InvestmentList($this);
    }

    public function 
getInvestments()
    {
        return 
$this->_investments;
    }

    public function 
getOwner()
    {
        return 
$this->_owner;
    }
}

class 
Player
{
    protected 
$_bankAccount;
    protected 
$_name;

    public function 
__construct($name)
    {
        
$this->_name $name;
        
$this->_bankAccount = new Bank_Account($this);
    }

    public function 
getBankAccount()
    {
        return 
$this->_bankAccount;
    }

    public function 
getName()
    {
        return 
$this->_name;
    }
}

$player = new Player('A. Nonymous');

$investments $player->getBankAccount()->getInvestments();
$investments->addInvestment('PHP'530);
$investments->addInvestment('Perl'170);
$investments->addInvestment('Java'820);

echo 
'<p>Anzahl Anlagen: ' $investments->getNumberOfInvestments() . '</p>';
echo 
'<p>Gesamtwert: '
        
$player->getBankAccount()->getInvestments()->getTotalValue() . '</p>';

echo 
'<hr />';

foreach (
$investments as $investment)
{
    echo 
'<p>Anlage: ' $investment->getTitle() . '</p>';
    echo 
'<p>Wert: ' $investment->getValue() . '</p>';
    echo 
'<p>Inhaber: '
            
$investment->getInvestmentList()->getBankAccount()->getOwner()->getName()
            . 
'</p>';
    echo 
'<hr />';
}

?>

Geändert von mermshaus (19.06.2009 um 06:53 Uhr).
mermshaus ist gerade online   Mit Zitat antworten
Alt 19.06.2009, 09:31  
Benutzer
 
Registriert seit: 18.06.2009
Beiträge: 42
PHP-Kenntnisse:
Fortgeschritten
Leichti befindet sich auf einem aufstrebenden Ast
Standard

Guten Morgen!
Also erstmal vielen vielen Dank für die Mühe!

Ich hätte noch ein paar kleine Fragen zu dem Code
PHP-Code:
class Bank_InvestmentList implements Iterator {} 
Ich verstehe nicht ganz was jetzt ein Iterator ist? Habe zwar auf Wikipedia und hier nachgesehen aber ich verstehs einfach nicht .
Ist es eine Schnittstelle? Dient dieser Iterator einzig und alleine um folgende Zeile nutzen zu können?
PHP-Code:
foreach ($investments as $investment) {} 

Weiters:
PHP-Code:
public function __construct(Player $owner
Was bedeutet dieses Player $owner?


Nochwas:
PHP-Code:
class Bank_InvestmentList {
public function 
__construct(Bank_Account $account)
}
//...
//...
//...
new Bank_InvestmentList($this); 
Referenziere ich hier einfach nur, dass der Bank Account und die Investmentlist "zusammen" gehören?

Trozdem danke nochmal, mit diesem Beispiel wird mir alles schonmal etwas besser verständlich!


Ps: Nochwas:
MVC, also Model View Controller.
Was wäre hier Model und was Controller? View ist mir denke ich klar!

mfg
Leichti ist offline   Mit Zitat antworten
Alt 19.06.2009, 18:50  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Leichti,

es ist schön, dass du etwas lernen möchtest, jedoch sollte dieses Forum primär für Diskussion über Software-Design-Ansätze verwendet werden. Um den Thread also weniger als Nachhilfe-Thread aussehen zu lassen, solltest du dich mit den Grundlagen einer objektorientierten Sprache (wie z.B. PHP) und mit den Basics von Software-Design beschäftigen ehe du im "Profi"-Forum postest. Das von dir beschriebene Buch beantwortet IMHO alle gestellten Fragen.

Viele Grüße,
Dr.E.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 20.06.2009, 12:00  
Benutzer
 
Registriert seit: 18.06.2009
Beiträge: 42
PHP-Kenntnisse:
Fortgeschritten
Leichti befindet sich auf einem aufstrebenden Ast
Standard

Ok Danke!
Ich hoffe das Buch ist Montag da, dann werd ich es mal durchlesen, und dann werd ich mich hier wieder melden wenn ich darf!

mfg
Leichti ist offline   Mit Zitat antworten
Alt 20.06.2009, 16:04  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Klar darfst du dich melden, nur Grundlagen besprechen wir besser im dafür vorgesehenen Forum.

BTW: Zum Thema Softwaredesign gibt es in der nächsten Ausgabe des PHP-Journal (4/2009) gibt es von mir auch einen Artikel zum Thema. Bis dahin könnten dich vielleicht Kontaktformular-Tutorial :: Adventure PHP Framework (APF) oder Gästebuch-Tutorial :: Adventure PHP Framework (APF) interessieren.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Suche Comunity Software hater Scriptbörse 3 20.06.2008 14:01
Verbesserungsvorschläge: Design und Suche Manko10 Board-Support 3 15.06.2008 16:21
suche php-formular und hilfe Beitragsarchiv 3 18.05.2005 15:28
HILFE - suche schon 4 Stunden djma PHP Tipps 2005 12 22.04.2005 00:33
Suche Hilfe beim erstellen eines Browsergames! Beitragsarchiv 13 18.04.2005 23:59
Suche Hilfe zur Zeitmessung PHP Tipps 2005 5 18.04.2005 09:09
phpBB 2.0.13 GEHACKT !!!! Suche professionelle Hilfe..... Beitragsarchiv 6 01.04.2005 22:22
[Erledigt] suche hilfe: html-body extrahieren und urls kürzen! PHP-Fortgeschrittene 9 07.03.2005 14:58
Suche Hilfe PHP Tipps 2005 4 28.02.2005 08:11
Suche -dringend- Hilfe zu einem Smily Mod! <- HiLFE - :-) PHP Tipps 2004-2 0 07.11.2004 13:50
Suche jemanden der mir Design mit triggers ClanPortal macht Beitragsarchiv 1 04.10.2004 21:05
Suche Hilfe für eine Fanpage zum Game Gothic 3 !! Beitragsarchiv 5 03.09.2004 14:58
Suche Tool oder Software Beitragsarchiv 4 12.08.2004 11:54
Suche Hilfe um Uploadscript umzuschreiben PHP Tipps 2004 3 10.08.2004 17:04
Hilfe suche Web Mail PHP Tipps 2004 1 27.06.2004 18:58

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php software design, software design php, software design tipps, php design software, php gutes software design, professionelles design programm, php design programm, php softwaredesign, gutes softwaredesign, softwaredesign tipps, php programm design, tipps software design php, software design suche, professionelles programm design, software design mit php, php gutes softwaredesign klassen, php file_exists muster, design tipps programm, php software professionelles programm, php 5 software design

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:34 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum