Prasácký kód? Ano nebo ne?   otázka

VB.NET, WinForms

Dobrý den. Napsal jsem si aplikaci pro správu seriálů a chtěl bych se zeptat, jestli by tento kód, jenž má jako první vytáhnout soubory podle zadané přípony, potom je podle první části jejich názvu rozřadit na seriály (každý musí být jen jednou :D) a potom podle těchto seriálů vytvořit TabPagy, do kterých má nacpat komponentu která bude ukazovat díly. Tak se tedy ptám - nejde tento kód napsat kultivovaněji?

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim st As New SettingsClass(IO.Path.Combine(Application.StartupPath, "settings.txt"))
        Dim files As New List(Of String)
        files.AddRange(IO.Directory.GetFiles(st.GetFilesPath(), st.GetVideoType()))
        Dim serialy As New List(Of String)
        For Each fe As String In files
            Dim soubor As String = IO.Path.GetFileNameWithoutExtension(fe)
            If serialy.Count > 0 Then
                Dim n As Integer = 0
                For Each sfe As String In serialy
                    If soubor.Split("-")(0).ToUpper() = sfe Then
                        n += 1
                    End If
                Next
                If n = 0 Then
                    serialy.Add(soubor.Split("-")(0).ToUpper())
                End If
            Else
                serialy.Add(soubor.Split("-")(0).ToUpper())
            End If
        Next

        For Each fe As String In serialy
            TabControl1.TabPages.Add(New TabPage(fe))
        Next
        For i As Integer = 0 To TabControl1.TabPages.Count - 1
            Dim sezn As New Seznam
            sezn.Serial = TabControl1.TabPages(i).Text
            sezn.Location = New Point(0, 0)
            TabControl1.TabPages(i).Controls.Add(sezn)
        Next
    End Sub

Díky za snahu a za odpověď.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Bylo by vhodnější rozdělit jednotlivé úkony do samostatných metod,aby byl kód přehlednější a bylo dodrženo nepsané pravidlo,že každá metoda by měla zastávat pouze jednu fci.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Určitě minimálně oddělit metodu, která získává data, a metodu, která jimi plní uživatelské rozhraní.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Lepší?

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim serials As List(Of String) = GetSerials(GetFiles())
        AddTabPages(serials)
    End Sub

    Private Function GetFiles() As List(Of String)
        Dim st As New SettingsClass(IO.Path.Combine(Application.StartupPath, "settings.txt"))
        Dim files As New List(Of String)
        files.AddRange(IO.Directory.GetFiles(st.GetFilesPath(), st.GetVideoType()))
        Return files
    End Function

    Private Function GetSerials(ByVal files As List(Of String)) As List(Of String)
        Dim serials As New List(Of String)
        For Each fe As String In files
            Dim file As String = IO.Path.GetFileNameWithoutExtension(fe)
            Dim su As String = file.Split("-")(0).ToUpper()
            If serials.Count > 0 Then
                Dim n As Integer = 0
                For Each sfe As String In serials
                    If su = sfe Then
                        n += 1
                    End If
                Next
                If n = 0 Then
                    serials.Add(su)
                End If
            Else
                serials.Add(su)
            End If
        Next
        Return serials
    End Function

    Private Sub AddTabPages(ByVal serials As List(Of String))
        For Each fe As String In serials
            TabControl1.TabPages.Add(New TabPage(fe))
        Next
        For i As Integer = 0 To TabControl1.TabPages.Count - 1
            Dim sezn As New Seznam
            sezn.Serial = TabControl1.TabPages(i).Text
            sezn.Location = New Point(0, 0)
            TabControl1.TabPages(i).Controls.Add(sezn)
        Next
    End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud by ty metody byly používány na více místech, pak jednoznačně souhlasím. Jinak v tom kromě snažšího unit testování (které tazatel stejně nedělá) nevidím žádnou výhodu.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Výhod je tam určitě víc než testování - z hlediska budoucí rozšiřitelnosti a udržovatelnosti je určitě lepší mít logiku rozdělenou. Navíc je to daleko přehlednější než původní varianta, je už z názvu víceméně jasné, co ta metoda dělá.

Ještě doplnit XML komentáře, vyčlenit metody GetSerials a GetFiles do jiné třídy, aby nesmrděly ve formuláři, a hned to vypadá lépe.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Pokud je ale jasné, že s rozšiřitelností to nesouvisí a nebude to využíváno na více místech, pak je to skutečně zbytečné. Rozesrávat všechno do desítek souborů, tříd a metod (obzvlášť pokud je jasné že to bude pouze k jednomu účelu) je nesmysl.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Když tohle platí v situaci, kdybych dělal projektík na jedno odpoledne nebo zápočtový program do školy.

V praxi jsem se v 90% případů setkal s projekty, kde se tento přístup vyplatil. Ono na začátku se lecos jeví jako finální a neměnitelné, ale často se ukáže, že to tak není.

Zadání se dost často mění i za běhu, jen málokterý zákazník je schopen promyslet a zformulovat své požadavky do hloubky, i když v posledních letech se to hodně zlepšilo.

Navíc zrovna v tomto případě mi přijde, že napsat to místo jedné čuňametody do čtyř relativně slušných nezabere ani o minutu navíc, pokud se člověk naučí psát to tak rovnou.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Omlouvám se, že jsem se nepřihlásil a beru to takhle - je to projektík na jedno odpoledne (nebo spíše na kousek noci a kousek rána), ale když se teď na to dívám, taky mi to přijde tak nějak "hezčí".

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Druhá varianta je určitě lepší a je dobré naučit se to psát rovnou tak - nezabere to o nic víc času a subjektivně bych řekl, že se v tom naseká míň chyb, když jednotlivé části oddělíte.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

To ano, problém je že zvyk je železná košile, ale i tak si budu muset zvyknout, protože tenhle zápis kódu je opravdu přehlednější!

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback