OOP Konzeptfrage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

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
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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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:
Das Leben ist wie ein Tennisball.
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ß
Antworten