[python] otázka ohladom mojho štýlu písania v OOP

Stefan Oravec stefan.oravec na realtime.sk
Pondělí Leden 14 23:08:06 CET 2013


Ja mam rad "Rule of 30" 
http://swreflections.blogspot.cz/2012/12/rule-of-30-when-is-method-class-or.html?m=1

S.

On 12. 1. 2013, at 18:46, Roman Beno <romanbeno273 at gmail.com> wrote:

> Dobrý den,
> 
> zmienený dokument som už prezeral. 
> Ako editor používam Stany Python editor, a pri kopírovaní sa kód mohol trošku zdeformovat (na zarovnanie, zalomenia riadkov atd)..
> 
> V mojej otázke som mal viac na mysli, či je vhodné písat jednu velkú metódu bez atribútov ako program, prípadne viac metód na rozkúskovanie a trochu sprehladnenie programu, resp. sa snažit aby čast kódu pri vytváranií instancie triedy (čiže už za dokončením definície triedy) bola čo najstručnejšia?
> 
> Tieto konkrétne informácie som bohužial zatial nikde nenašiel :-(
> Ďakujem za odpoved
> 
> 
> Dňa 12. január 2013 18:23, Jan Bednařík <jan.bednarik at gmail.com> napísal(-a):
>> Ahoj,
>> 
>> v prvé řadě bych doporučil nastudovat si PEP-8, což je doporučení (de-facto standard) jak psát kód v Pythonu. http://www.python.org/dev/peps/pep-0008/
>> 
>> Honza
>> 
>> 
>> 
>> 2013/1/12 Roman Beno <romanbeno273 at gmail.com>
>>> Dobrý deň,
>>> 
>>> chcel by som sa spýtať na váš názor ohľadne môjho štýlu písania programov v OOP.
>>> Rád prijmem akukolvek kritiku, mojim cielom je sa v tomto ohľade zlepšit a v tejto oblasti som si nie som príliš istý.
>>> 
>>> Tu sú ukážky mojich kódov:
>>> 
>>> # -*- coding: utf-8 -*-
>>> #################Definícia triedy#######################
>>> class Fibonacci:
>>>     "Fibonacciho trieda"
>>>     def __init__(self,a=0,b=1,pocet_cisiel=10,default=0):
>>>         "Vyrobíme stavebný materiál pre fibonaccciho postupnosť."
>>>         self.a=a
>>>         self.b=b
>>>         self.pocet_cisiel=pocet_cisiel
>>>         self.default=default
>>>     def proces(self):
>>>         print(self.a,self.b,end=" ")
>>>         while True:
>>>             self.a=(self.a+self.b)
>>>             self.default+=1
>>>             if self.default>=self.pocet_cisiel:
>>>                 print("\n")
>>>                 break
>>>             print(self.a,end=" ")
>>>             # postupnost bude a,b,a,b,a,b... tento blok je pre všetky a
>>>             self.b=(self.a+self.b)
>>>             self.default+=1
>>>             if self.default>=self.pocet_cisiel:
>>>                 print("\n")
>>>                 break
>>>             print(self.b,end=" ")  
>>>             # a tento pre všetky b
>>> #################Hlavný program##########################
>>> MojaInstancia=Fibonacci(pocet_cisiel=20)
>>> MojaInstancia.proces()
>>> 
>>> ************************************************************************************************************
>>> Tu je další:
>>> 
>>> # -*- coding: utf-8 -*-
>>> # program Záznamník adries
>>> # tréning Tkinter + OOP
>>> # autor JA, dnes
>>> # ver. 1.0
>>> # * opravená chyba pri vytvárani poľa pre zadávaní adresy, použitá neexistujúca farba okna
>>> # * opravená chyba pri vytváraní tlačítka ukončujúceho okno zadávania, použitý neexistujúci názov prvku
>>> # * zmenené umiestnenie a veľkosť tlačítka pre zavretie okna pri pridávaní adries
>>> # ver. 1.1
>>> # * opravená chyba pri potvrdení voľby mena pri pridávaní mena, použitá neexistujúca premenná
>>> # * opravená chyba pri potvrdení voľby mena pri pridávaní adresy, použitá neexistujúca premenná
>>> # ver. 1.2
>>> # * polia pre zadávaní mena aj adresy sa po zadaní oboch údajov teraz vymažú (ich hodnota)m
>>> #   uživatel ich teraz nemusí zadávať sám
>>> # * opravená chyba pri  načítaní údajov zo zoznamu, použitá neexistujúca premenná
>>> # ver. 1.2.1
>>> # * opravená chyba pri zobrazovaní načítaných údajov,použitá neexistujúca premenná
>>> # ver. 1.3
>>> # * opravená chyba pri vytváraní tlačítka na zavretie okna načítania údajov, použitá neexistujúca
>>> #   premenná
>>> # * opravená chyba pri zobrazovaní načítaných údajov (druhá chyba v tomto), použitá neexistujúca premenná
>>> # * zmenený text niektorých tlačítok v úvodnom menu
>>> # * v popisku okna sa teraz zobrazuje aj aktuálna verzia programu
>>> # ver. 1.3.1
>>> # * pri načítaní údajov upravená oddelovacia čiara údajov
>>> # * zmenené rozmery tlačítka ukončujúceho okno načítania údajov
>>> # ver. 1.3.2
>>> # * v okne ukladania súboru zmenená farba informačného textu na prehľadnejšiu
>>> # * opravená chyba pri ukladaní súborov, použitá neexistujúca premenná
>>> # ver. 1.4
>>> # * opravená chyba pri ukladaní súborov, použitá ďalšia neexistujúca premenná
>>> # * zmenená farba riadku pre chybové hlásenia v okne ukladania dát na prirodzenú bledomodrú
>>> # * pridaná možnosť odstránenia položiek zo zoznamu
>>> 
>>> 
>>> from tkinter import *
>>> import sys
>>> import os
>>> 
>>> class Zaznamnik:
>>>     "Toto je trieda môjho záznamníku"
>>>   
>>>     def __init__(self):
>>>         self.hlavneOkno=Tk()
>>>         self.hlavneOkno.title("Záznamník, Ver. 1.4")
>>>         self.adresy=[]
>>>         self.zoznamMena=[]
>>>       
>>>     def program(self):
>>>         "Táto časť programu bude mať za úlohu čisto len grafiku hlavného menu (nie logiku)."
>>>         self.HOuvodnypopisokLabel=Label(self.hlavneOkno,bg="lightblue",text="Vitajte v mojom záznamníku adries.\nDúfam, že sa vám bude páčiť.")
>>>         self.HOuvodnypopisokLabel.grid(row=0,column=0,sticky=W+E+N+S)
>>>         # uvodny popisok - label - ktorý nás privíta v programe
>>>         self.HOtlacitkoZadavatAdresy=Button(self.hlavneOkno,bg="lightblue",activebackground="lightgreen",text="Pridať adresy do záznamníka")
>>>         self.HOtlacitkoZadavatAdresy.grid(row=1,column=0,sticky=W+E+N+S)
>>>         # tlačítko, ktoré by malo umožniť zadávanie adries
>>>         self.HOtlacitkoOdstranitAdresy=Button(self.hlavneOkno,bg="lightblue",activebackground="lightgreen",text="Odstrániť adresu zo záznamníka")
>>>         self.HOtlacitkoOdstranitAdresy.grid(row=2,column=0,sticky=W+E+N+S)
>>>         # tlačítko, ktoré by malo umožniť odstránenie adries
>>>         self.HOtlacitkoUlozit=Button(self.hlavneOkno,bg="lightblue",activebackground="lightgreen",text="Uložiť do súboru")
>>>         self.HOtlacitkoUlozit.grid(row=3,column=0,sticky=W+E+N+S)
>>>         # tlačítko, ktoré by malo umožnit uloženie do súboru
>>>         self.HOtlacitkoNacitat=Button(self.hlavneOkno,bg="lightblue",activebackground="lightgreen",text="Načítať dáta zo zoznamu")
>>>         self.HOtlacitkoNacitat.grid(row=4,column=0,sticky=W+E+N+S)
>>>         # tlačítko, ktoré by malo umožniť načítanie dát zo súboru
>>>         self.HOtlacitkoNapoveda=Button(self.hlavneOkno,bg="lightblue",activebackground="lightgreen",text="Zobrazenie nápovedy")
>>>         self.HOtlacitkoNapoveda.grid(row=5,column=0,sticky=W+E+N+S)
>>>         # tlačítko, ktoré by malo zobraziť nápovedu
>>>         self.HOtlacitkoUkoncit=Button(self.hlavneOkno,bg="lightblue",activebackground="lightgreen",text="Ukončiť program",command=self.hlavneOkno.quit)
>>>         self.HOtlacitkoUkoncit.grid(row=6,column=0,sticky=W+E+N+S)
>>>         # tlačítko, ktoré by malo ukončiť program
>>>       
>>>         def zadavanie_adries():
>>>             "Táto časť bude zachytávať logiku programu. Kvoli velkému rozsahu rozdelenú na niekoľko častí. Konkrétne zadávanie adries."
>>>             # prvá časť tejto funkcie
>>>             # vzhľad podokna na zadávanie
>>>             self.OknoZadavanie=Toplevel()
>>>             self.OknoZadavanie.title("Zadávanie adries")
>>>             self.OknoZadavanieLabel=Label(self.OknoZadavanie,bg="lightblue",text="             Aktuálna činnosť: Zadávanie adries                 \nPre potvrdenie  údaju z okna stlačte ENTER.\n")
>>>             self.OknoZadavanieLabel.grid(row=0,column=0,columnspan=4,sticky=W+E+N+S)
>>>             # Vytvorenie podokna na zadávanie adries, nastavený titulok + úvodný Label
>>>             self.VarPPCH=StringVar()
>>>             self.OknoZadavanieLabelChybHlasky=Label(self.OknoZadavanie,bg="lightblue",textvariable=self.VarPPCH)
>>>             self.OknoZadavanieLabelChybHlasky.grid(row=1,column=0,columnspan=4,sticky=W+E+N+S)
>>>             # Vytvorená textová premenná pre prípadné chybové hlášky. Pre začiatok sa bude tváriť ako
>>>             # neviditeľná súčasť okna
>>>             self.RamecZadajMeno=Frame(self.OknoZadavanie,bd=3,bg="lightblue")
>>>             self.RamecZadajMeno.grid(row=2,column=0,columnspan=4,sticky=W+E+N+S)
>>>             self.VarPZM=StringVar()
>>>             # Vytvorený rámec pre zadanie mena + popisok k nemu. Taktiež premenná pre políčko
>>>             # pre vstup
>>>             self.RamecPopisokPola=Label(self.RamecZadajMeno,text="Zadajte meno dotyčného:",bg="lightblue")
>>>             self.RamecPopisokPola.grid(row=2,column=0,sticky=W+E+N+S)
>>>             self.PolePreVstupMena=Entry(self.RamecZadajMeno,bg="lightyellow",textvariable=self.VarPZM,font="Arial 8")
>>>             self.PolePreVstupMena.grid(row=2,column=1,columnspan=3,sticky=W+E+N+S)
>>>             # Vytvorený popisok pre pole pre vstup + políčko samotné
>>>             self.RamecZadajAdresu=Frame(self.OknoZadavanie,bd=4,bg="lightblue")
>>>             self.RamecZadajAdresu.grid(row=3,column=0,columnspan=4,sticky=W+E+N+S)
>>>             self.LabelPreDruhePole=Label(self.RamecZadajAdresu,bg="lightblue",text="Zadajte adresu dotyčného: ")
>>>             self.LabelPreDruhePole.grid(row=3,column=0,sticky=W+E+N+S)
>>>             self.VarPPA=StringVar()
>>>             self.PolePreAdresu=Entry(self.RamecZadajAdresu,bg="lightyellow",textvariable=self.VarPPA,font="Arial 8")
>>>             self.PolePreAdresu.grid(row=3,column=1,columnspan=3)
>>>             # Vytvorený rámec pre zadanie adresy, popis pre neho, premennú pre neho a taktiež pole
>>>             # samé.
>>>             self.ZadavacieTlacitkoUkoncit=Button(self.OknoZadavanie,bg="lightblue",activebackground="lightgreen",command=self.OknoZadavanie.destroy,text="Zavrieť toto okno")
>>>             self.ZadavacieTlacitkoUkoncit.grid(row=4,column=0,columnspan=4,sticky=W+E+N+S)
>>>             self.OverovaciToken=0
>>>             # Vytvorené tlačítko pre zavretie tohto okna pre zadanie adresy.
>>>             def enter(BoloStlacene):
>>>                 BoloStlacene.widget.configure(state=DISABLED)
>>>                 self.udajMeno=str(self.PolePreVstupMena.get())
>>>                 self.OverovaciToken+=1
>>>                 if self.OverovaciToken==2:
>>>                     self.PolePreVstupMena.configure(state=NORMAL)
>>>                     self.PolePreAdresu.configure(state=NORMAL)
>>>                     self.zoznamMena.append(self.udajMeno)
>>>                     self.VarPZM.set("")
>>>                     self.VarPPA.set("")
>>>                     self.adresy.append([self.udajMeno,self.udajAdresu])
>>>                     self.OverovaciToken=0
>>>             # funkcia, čo sa má stať po zdarnom zadaní informácie do políčka Meno. Dané políčko
>>>             # sa disabluje, údaj z neho sa uloží. + špecialita overovací token. Ak dosiahne hodnotu 2,
>>>             # program zistí, že má spravit ďalšiu "obrátku" pri pridávaní do zoznamu
>>>             def entri(StlaceneBolo):
>>>                 StlaceneBolo.widget.configure(state=DISABLED)
>>>                 self.udajAdresu=str(self.PolePreAdresu.get())
>>>                 self.OverovaciToken+=1
>>>                 if self.OverovaciToken==2:
>>>                     self.PolePreVstupMena.configure(state=NORMAL)
>>>                     self.PolePreAdresu.configure(state=NORMAL)
>>>                     self.zoznamMena.append(self.udajMeno)
>>>                     self.VarPZM.set("")
>>>                     self.VarPPA.set("")
>>>                     self.adresy.append([self.udajMeno,self.udajAdresu])
>>>                     self.OverovaciToken=0
>>>             # táto funkcia zase slúži na definovanie činnosti políčka Adresy. Zapíše údaj
>>>             # do zoznamu a disabluje políčko. Malo by to zabezpečiť zadávanie.
>>>             self.PolePreVstupMena.bind("<Return>",enter)
>>>             self.PolePreAdresu.bind("<Return>",entri)
>>>             # čo sa má stať po stlačení Entrov v rôznych okienkach
>>>           
>>>         def nacitanie_dat():
>>>             "Táto funkcia by mala zabezpečiť zobrazenie, resp. načítanie dát zo zoznamu."
>>>             self.OknoNacitanie=Toplevel()
>>>             self.OknoNacitanie.title("Načítanie dát")
>>>             # vytvorené vlastné okno pre načítanie dát, kde by sa teoreticky mali zobrazovať
>>>             # dáta uložené v zozname adries
>>>             self.oknoNacitanieZobrazenie=Label(self.OknoNacitanie,bg="lightblue",text="")
>>>             self.oknoNacitanieZobrazenie.grid(row=0,column=0)
>>>             self.premenna="""\tMená\t\tAdresy\n***************************************\n"""
>>>             if len(self.adresy)==0:
>>>                 self.oknoNacitanieZobrazenie.configure(text="Zoznam je prázdny.")
>>>             else:
>>>                 for p in self.adresy:
>>>                     self.coNacitaj="\t{0}\t\t{1}\n".format(p[0],p[1])
>>>                     self.premenna+=self.coNacitaj
>>>                 self.oknoNacitanieZobrazenie.configure(text=self.premenna)
>>>             # toto by malo zabezpečiť zdarné zobrazovanie položiek zoznamu
>>>       
>>>             self.tlacitkoUkoncitON=Button(self.OknoNacitanie,bg="lightblue",activebackground="lightgreen",text="Zavrieť toto okno",command=self.OknoNacitanie.destroy)
>>>             self.tlacitkoUkoncitON.grid(row=1,column=0,sticky=N+S+E+W)
>>>             # toto tvorí tlačítko, ktoré by mohlo zavrieť okno
>>>       
>>>         def ulozenie_do_suboru():
>>>             "Toto má na starosti zdarné uloženie dát do súboru. Trošku nám pomôže predošlá funkcia, načítanie dát."
>>>             self.OknoUlozenie=Toplevel()
>>>             self.OknoUlozenie.title("Uloženie do súboru")
>>>             self.OknoUlozenieLabelVyber=Label(self.OknoUlozenie,text="Vyberte meno súboru, do ktorého chcete uložiť dáta zo súboru.",bg="lightblue")
>>>             self.OknoUlozenieLabelVyber.grid(row=0,column=0,columnspan=2,sticky=W+E+N+S)
>>>             # vytvorené ukladacie okno, nastavený popisok pre neho + popisok pre políčko pre zadanie mena ukladacieho súboru
>>>             self.OUPPV=StringVar()
>>>             self.OUPolePreVstup=Entry(self.OknoUlozenie,bg="lightyellow",font="Arial 8",textvariable=self.OUPPV)
>>>             self.OUPolePreVstup.grid(row=0,column=2,columnspan=2,sticky=W+E+N+S)
>>>             # pole, kam môžeme zadávať samotný názov súboru
>>>             self.OUPosudzovaciaHlaska=Label(self.OknoUlozenie,bg="lightblue",text="")
>>>             self.OUPosudzovaciaHlaska.grid(row=1,column=0,columnspan=4,sticky=W+E+N+S)
>>>             # tu sa vypíš prípadná chybová hláška, v závislosti od toho, čo zadáme do zmieneného políčka
>>>             def entricek(ppv):
>>>                 self.result=str(self.OUPolePreVstup.get())
>>>                 if len(self.result)==0:
>>>                     self.OUPosudzovaciaHlaska.configure(text="Nezadali ste meno žiadneho súboru.")
>>>                     self.OUPPV.set("")
>>>                     return
>>>                 # ak ste nezadali nič, tak vypíše hlášku, znuluje hodnotu pola a zavrie funkciu
>>>                 if len(self.adresy)==0:
>>>                     self.OUPosudzovaciaHlaska.configure(text="Zoznam adries je prázdny.")
>>>                     self.OUPPV.set("")
>>>                     return
>>>                 # podobné ako v predchádzajúcom prípade, ibaže ak je zoznam adries prázdny
>>>                 self.subor=open(self.result,"wt")
>>>                 try:
>>>                     self.subor.write(self.premenna)
>>>                 except:
>>>                     self.OUPosudzovaciaHlaska.configure(text="Zatial ste nenačítali žiadne dáta. Urobte tak cez hlavné menu.")
>>>                     self.subor.close()
>>>                     self.OUPPV.set("")
>>>                     return
>>>                     # stale je možnost že uživatel nenačítal požadované dáta na vloženie
>>>                 self.OUPosudzovaciaHlaska.configure(text="Zatial ste nenačítali žiadne dáta. Urobte tak cez hlavné menu.")
>>>                 self.subor.close()
>>>                 self.OUPolePreVstup.configure(state=DISABLED)
>>>                 # toto sa stane v pripade že chyba nenastala,
>>>             self.OknoUlozenie.bind("<Return>",entricek)
>>>             self.OUTlacitkoZavri=Button(self.OknoUlozenie,bg="lightblue",activebackground="lightgreen",text="Zavrieť toto okno",command=self.OknoUlozenie.destroy)
>>>             self.OUTlacitkoZavri.grid(row=2,column=0,columnspan=4,sticky=W+E+N+S)
>>>             # urobené tlačítko, ktoré zavrie okno
>>>       
>>>         def odstranenie_poloziek():
>>>             "Odstránenie jedného záznamu zo zoznamu adries a mien"
>>>             self.OknoOdstranenie=Toplevel()
>>>             self.OknoOdstranenie.title("Odstranenie poloziek")
>>>             self.OOpripravenytext=[]
>>>             # vytvorené okno odstránenia, nastavený popisok + náradíčko = prázdny zoznam
>>>             for x in self.zoznamMena:
>>>                 self.OOpripravenytext.append(x)
>>>             self.OOodstranenieLabel=Label(self.OknoOdstranenie,bg="lightblue",text="Vyberte si položku zoznamu,ktorú\nchcete odstrániť:")
>>>             self.OOodstranenieLabel.grid(row=0,column=0)
>>>             # pripraví zoznam položiek pre neskoršie odstranovanie + vytvorenie labelu na odstranenie
>>>             # položky
>>>             self.OOPPO=StringVar()
>>>             self.OOPolePreOdstranenie=Entry(self.OknoOdstranenie,bg="lightyellow",textvariable=self.OOPPO,font="Arial 8")
>>>             self.OOPolePreOdstranenie.grid(row=0,column=1,columnspan=2,sticky=W+E+S+N)
>>>             self.OOLabelChybovaHlaska=Label(self.OknoOdstranenie,bg="lightblue",text="")
>>>             self.OOLabelChybovaHlaska.grid(row=1,column=0,columnspan=3,sticky=W+E+S+N)
>>>             # samotné políčko, kam možete zadat meno položky (meno konk.osoby, ktorú chcete odstrániť
>>>             def stlacil_entri(gangnam):
>>>                 coBoloStlacenee=str(self.OOPolePreOdstranenie.get())
>>>                 if coBoloStlacenee in self.zoznamMena:
>>>                     indexCoBoloStlacenee=self.zoznamMena.index(coBoloStlacenee)
>>>                 else:
>>>                     self.OOLabelChybovaHlaska.configure(text="Neexistujúce meno.")
>>>                     self.OOPPO.set("")
>>>                 del self.adresy[indexCoBoloStlacenee]
>>>                 del self.zoznamMena[self.zoznamMena.index(coBoloStlacenee)]
>>>                 self.OOPPO.set("")
>>>                 # zoberieme to z políčka pre vstup, ak je v zozname mien, odstrán z oboch zoznamov
>>>                 # ak nie, vyhod chybove hlasky. Samozrejmostou je nasledne premazanie policka
>>>             self.OOPolePreOdstranenie.bind("<Return>",stlacil_entri)
>>>             self.OOZavriOkno=Button(self.OknoOdstranenie,bg="lightblue",activebackground="lightgreen",text="Zavrieť toto okno",command=self.OknoOdstranenie.destroy)
>>>             self.OOZavriOkno.grid(row=2,column=0,columnspan=3,sticky=W+E+S+N)
>>>             # zabezpečená akcia pre pole pre vstup po stlačení Enteru.
>>>             # vytvorené tlačítko na zavretie okna
>>>               
>>>           
>>>         self.HOtlacitkoNacitat.configure(command=nacitanie_dat)
>>>         self.HOtlacitkoUlozit.configure(command=ulozenie_do_suboru)
>>>         self.HOtlacitkoZadavatAdresy.configure(command=zadavanie_adries)
>>>         self.HOtlacitkoOdstranitAdresy.configure(command=odstranenie_poloziek)
>>>       
>>>         self.hlavneOkno.mainloop()
>>>       
>>> #########################################################
>>>           
>>> inst=Zaznamnik()
>>> inst.program()
>>>           
>>> Ďakujem za akúkolvek odpoved
>>> 
>>> 
>>> _______________________________________________
>>> Python mailing list
>>> Python at py.cz
>>> http://www.py.cz/mailman/listinfo/python
>> 
>> 
>> _______________________________________________
>> Python mailing list
>> Python at py.cz
>> http://www.py.cz/mailman/listinfo/python
> 
> _______________________________________________
> Python mailing list
> Python at py.cz
> http://www.py.cz/mailman/listinfo/python
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.py.cz/pipermail/python/attachments/20130114/de68c5ea/attachment.html>


Další informace o konferenci Python