Seite 1 von 1

OOP Konzeptfrage

Verfasst: Dienstag 16. März 2010, 23:29
von bankkind
Hallo zusammen,
ich habe einige Fragen zu OOP Programmierung. Ich habe jetzt schon einiges gelesen zu dem Thema, aber ich will es einfach nicht verstehen :-/

Ich wuerde das ganze mal anhand eines Problems, als Beispiel, verdeutlichen. Vor einiger Zeit habe ich mal ein Skript geschrieben, um eine definierte Liste von URL's in bestimmten Intervallen aufzurufen, der Anwendung konnte dann anhand von Antwortzeit, HTTP-StatusCode etc. auswerten ob es ein PRoblem gibt oder nicht und ggf. Alarme versenden

Das Grosse Thema ist Monitoring.
Ich will eine Website ueberwachen (Genau genommen spezielle URL Sequenzen und ueberpruefung von Content)

Die Daten (ZielURLs, Schwellwerte, noetige Maßnahmen etc.) die ich ueberwachen will kann ich ja irgendwo gesammelt ablegen (zB DB, in ConfigTable oder in ConfigFile).

Die Applikation soll nun anhand von diesen Information die Ueberwachung vornehmen koennen.

Die Frage ist jetzt... Wie geht man hier Grundsaetzlich ran?
  • (1)Definiere ich hierfuer eine Klasse (Monitor)?
    (2)Definiere ich in den Klassenattributen die Konfiguration bzw. den Ort dieser? (Weil ja alle Methoden darauf zugreifen muessen)
    (3)Eine Methode waere ja hier wahrscheinlich ein zB URLcheck die mir zurueckmeldet OK/WARNING/CRITICAL
    (4)Welche Rolle spielt hierbei die __init__ Methode?
Ich fange mal an mit meiner grundsaetzlichen Idee:

Code: Alles auswählen

class Monitor(object):
	
	def __init__(self):
		# init method
		
	def URLcheck(self):
		return checkit()
		
	def Alarming(self):
		sendmail()
Es ist leider nicht viel.
  • (5)Sind in meinem Beispiel die Klasse und die Methoden korrekt/sinnvoll gewaählt? WIe gehts hier weiter?
Ich glaube ich schmeisse hier leider die Dinge noch durcheinander, aber ich ich brauche dringend einen schubs in die richtige Richtung.. Ich hoffe ihr koennt helfen...

VG

Verfasst: Dienstag 16. März 2010, 23:58
von BlackJack
@bankkind: Methoden sollten etwas tun, also Dein `checkit()` sollte dann vielleicht das `URLcheck()` sein. Und das sollte vielleicht besser `check_url()` heissen. Und die Methode sollte irgendetwas mit dem `Monitor` machen, also das `self` benötigen. Sonst ist das kein Kandidat für eine Methode.

Ich fange normalerweise mit kleineren Datentypen an, und nicht mit dem "obersten". Hier ist nämlich IMHO die Gefahr, dass Du einfach nur den Inhalt eines Moduls, also Funktionen, in eine Klasse verschiebst, ohne dass das irgendeinen Vorteil hätte.

Verfasst: Mittwoch 17. März 2010, 11:22
von sma
Grundregel: Objekte = Nomen, Methoden = Verben. `Monitor` ist ein guter Name für die Klasse eines Objekts, doch `URLcheck` oder `Alarming` sind keine guten Namen für Methoden. In Python gibt es außerdem die Konvention, Methoden klein zu schreiben und Wörter mit _ zu trennen.

Code: Alles auswählen

class Monitor:
    def check_URL(self):
        ...
    
    def alert_by_mail(self):
        ...
Die Aufgabe in Teilaufgaben zu zerlegen (die dann von kleinen Methoden erledigt werden) ist ein guter Ansatz. `__init__` dient zur Initialisierung eines Objekts nach dem Erzeugen.

Code: Alles auswählen

class Monitor:
    def __init__(self, url, email):
        self.url = url
        self.email = email
    ...
    def alert_by_mail(self):
        Mailer(to=self.email, subject="Something went wrong").send()
        
m = Monitor(url="http://www.heise.de", email="bankkind@example.com")
Stefan

Verfasst: Mittwoch 17. März 2010, 20:49
von bankkind
Hallo zusammen,

erstmal Danke fuer die Antworten.

Ich habe nun mal eine Klasse geschrieben, habe aber bewusst ein anderes Thema gewaehlt. Mich interessiert die Grundsaetliche Meinung dazu:

Code: Alles auswählen

class Car(object):
	
	def __init__(self,hersteller,typ):
		self.hersteller = hersteller
		self.typ = typ
	
	def accelerate(self):
		print 'beschleunige ' + self.hersteller + ' ' + self.typ
		
	def brake(self):
		print 'bremse... ' + self.hersteller + ' ' + self.typ
		
		
bmw = Car('Opel','Corsa')

bmw.accelerate()
bmw.brake()
@BlacJack: Deinen letzten Absatz verstehe ich leider nicht. Kannst du diesen nochmal erlaeutern.

Verfasst: Mittwoch 17. März 2010, 21:00
von Darii
bankkind hat geschrieben:Ich habe nun mal eine Klasse geschrieben, habe aber bewusst ein anderes Thema gewaehlt. Mich interessiert die Grundsaetliche Meinung dazu:
Was soll man dazu groß sagen? Bei einer Klasse die nichts tut, kann man nicht viel falsch machen, außer sie überhaupt zu schreiben.

Ich weiß nicht was du dazu hören willst. Du hast deinen Methoden schöne Namen gegeben?

Verfasst: Mittwoch 17. März 2010, 21:07
von EyDu
Hallo!

Bei der kleinen Klasse kannst du eigentlich nicht viel falsch machen. Es fehlt allerdings eine Eigenschaft, mit welche Autos vom selben Hersteller und selben Typ unterschieden werden koennen. Was machst du, wenn du zwei Opel Corsa hast?

Strings muss du uebrigens nicht addieren, dazu gibt es String-Formatting. Das das Auto bmw heisst finde ich sehr gelungen :D

Und zu BlackJacks letztem Absatz: Du solltest mit den einfachen Dingen beginnen und daraus schrittweise komplexere zusammenbauen, nicht anders herum. Faengst du mit den komplexen Dingen an passiert es schnell, dass man Methoden und Klassen produziert, die eigentlich nur Funktionen sind und auf Modulebene gehoeren.

Bis dann,
Sebastian

Verfasst: Mittwoch 17. März 2010, 21:09
von EyDu
Darii hat geschrieben:Bei einer Klasse die nichts tut, kann man nicht viel falsch machen, außer sie überhaupt zu schreiben.
EyDu hat geschrieben:Bei der kleinen Klasse kannst du eigentlich nicht viel falsch machen.
Zwei Brote, ein Gedanke :lol:

Verfasst: Mittwoch 17. März 2010, 21:31
von problembär
@bankkind: Deine Klasse zeigt, daß Du auf dem richtigen Weg bist, das OOP-Konzept zu verstehen.
Allerdings bräuchtest Du noch mindestens ein Attribut

Code: Alles auswählen

self.velocity = 0
das dann durch .accelerate() erhöht und durch .brake() vermindert wird.

Gruß