Miesięczne archiwum: Czerwiec 2017

Jak sobie radzić z gigantycznymi metodami

Jak sobie radzić z gigantycznymi metodami

Ile to razy otwieraliśmy jakiś kawałek kodu i nagle szok. Metoda ma 300 linijek i z 6 zmiennych. Jak sobie radzić z gigantycznymi metodami? Przedstawię kilka wypracowanych przepisów na radzenie sobie z legacy code. Nie będą one związane z jakimiś konkretnymi wzorcami itp…

Cały kod jest dostępny na GitHub.

Gigantyczne metody

Tak powiem w tajemnicy, że największa metoda z jaką miałem do tej pory do czynienia miała łącznie 9009 linijek i przyjmowała 25 parametrów. Podręcznikowy przykład clean code.

Według mnie metoda zaczyna się robić za duża gdy nie mieści się w 10 linijkach, oraz ilość parametrów jest większa niż 3.

Co z tym zrobić

Ogarnięcie wielu parametrów

Z parametrami możemy sobie dość łatwo poradzić tworząc prostą klasę POCO i przekazać jako parametr.

Poniżej przykład takiej metody. Do demonstracji specjalnie wybrałem VB.NET ze względu na znikome wsparcie dla refactor ze strony VS.

Function DoSuperComplicated(ByVal param1 As String, ByVal param2 As String, ByVal param4 As Boolean, ByVal param5 As Boolean, ByVal param6 As Integer, ByVal param7 As String, Optional ByVal param8 As String) As Boolean
        If param4 Then
            'Do something
            Select Case param2
                Case "Somevalue"
                    While continueValue
                        'Do Something
                        If param5 Then
                            'Do something
                        ElseIf param6 = 1 Then
                            'Do something
                        End If
                    End While
            End Select
        End If

        Return True
    End Function

A więc bierzemy się za poprawę takiego kodu. Tworzymy klasę POCO i zmieniamy sygnaturę naszej metody.

Public Class Parameters
    Public Property Param1() As String

    Public Property Param2() As String

    Public Property Param4() As Boolean

    Public Property Param5 As Boolean

    Public Property Param6 As Integer

    Public Property Param7 As String

    Public Property Param8 As String
End Class
...
    Function DoSuperComplicated(ByVal parameters As Parameters) As Boolean
        If parameters.Param4 Then
            'Do something
            Select Case parameters.Param2
                Case "Somevalue"
                    While continueValue
                        'Do Something
                        If parameters.Param5 Then
                            'Do something
                        ElseIf parameters.param6 = 1 Then
                            'Do something
                        End If
                    End While
            End Select
        End If

        Return True
    End Function
...

Co w sytuacji gdy dostajemy wymaganie od klienta ze zmianą logiki albo stworzenie nowej funkcjonalności? Nie wiemy co robi obecna metoda i biznes również nie jest nas w stanie na to naprowadzić.

Pierwsza myśl, która przychodzi do głowy to zaorać… Później w gąszczu przekleństw i złorzeczeń wobec innych programistów przychodzi inny pomysł do głowy.

Tworzymy coś nowego

W sytuacji jak powyższa staram się stworzyć bibliotekę w C# obok obecnego rozwiązania. Zyskujemy tym możliwość „panowania” nad kodem, oraz możliwości jego testowania.

Poniżej przykład jak można to osiągnąć.

    Private continueValue As Boolean = True

    Function DoSuperComplicated(ByVal parameters As Parameters) As Boolean
        Dim externalLogic As SomethingNew = New SomethingNew()

        If parameters.Param4 Then
            'Do something
            Select Case parameters.Param2
                Case "Somevalue"
                    While continueValue
                        'Do Something
                        externalLogic.DoSomethingNew(True)

                        If parameters.Param5 Then
                            'Do something
                        ElseIf parameters.Param6 = 1 Then
                            'Do something
                        End If
                    End While
            End Select
        End If

        Return True
    End Function

Definicja przykładowej logiki w C#

    public class SomethingNew
    {
        /// <summary>
        /// Do something new
        /// </summary>
        /// <param name="proceed">Mark process to execute some custome logic</param>
        public void DoSomethingNew(bool proceed)
        {
            //Do Something
        }
    }

Ulga

Jak widzicie można sobie poradzić z legacy code w całkiem prosty sposób. Nie ma sensu brnąć tygodniami w starym zabagnionym kodzie lepiej, szybciej i taniej będzie zrobić coś z boku.

A więc nie bądźcie przerażeni jak widzicie takie potworki w swojej pracy tylko do dzieła bo to jest proste.

Rebranding projektu i zmiana koncepcji blog-a

Rebranding projektu i zmiana koncepcji blog-a

Ostatnio dużo myślałem nad rebrandingiem projektu i zmianą koncepcji blog-a, co chciałbym nim przekazać, oraz co dalej z 10Things. Po takim głębokim zastanowieniu i rozmyślaniach nadeszła chwila na implementację.

Zmiana koncepcji blog-a

Na co dzień pracuję przy aplikacjach enterprise i widzę u młodych programistów swego rodzaju obrzydzenie do tzw. brownfield. Nie ukrywajmy programiści na co dzień wolą tzw. greenfield. Pracę przy nowościach i najnowszych framework-ach.

Niestety ponura rzeczywistość jest trochę inna. W pracy spotykamy się z wielkimi kobyłami, które mają wielu autorówojców. Nierzadko są kiepsko napisane bo już zabrakło czasu i budżetu na refactor.

Chciałbym zmienić ten stan rzeczy i pokazać, że ten enterprise i legacy code nie taki straszny. Można również na jego bazie tworzyć ciekawe rozwiązania i często spotykane problemy są bardzo interesujące.

10Things rebranding

Rebranding

proces transformacji wszystkich elementów marki, takich jak oferowane produkty i usługi, jakość obsługi oraz sposób komunikacji, w tym wygląd logo, by osiągnąć lepszą pozycję marki na rynku. Samej zmiany wyglądu logo nie można nazwać rebrandingiem, jest to bowiem jedynie zmiana identyfikacji wizualnej, od niewielkiego liftingu po całkowitą zmianę symboli graficznych marki. Natomiast proces rebrandingu strategicznego, wiążącego się z wdrożeniem nowej strategii przedsiębiorstwa, nie musi wiązać się ze zmianą nazwy czy całkowitą wymianą logo

No właśnie nadal szukam pomysłu na nazwę projektu\produktu. W każdym bądź razie zaczynam pracę nad projektem od początku z nowymi pomysłami i koncepcją na cały marketing wokoło.

Będę opisywał cały proces na bieżąco na blogu. Począwszy od etapu nauki Xamarin.Forms, aż po marketing.
Ma to stanowić swego rodzaju przewodnik dla młodych programistów jak mogą podejść do stworzenia czegoś swojego. Gdzie szukać informacji, jak promować produkt i jak go wdrożyć do sklepów.

Przyszłość…?

Co przyniesie przyszłość pożyjemy zobaczymy.

Jak widzicie mam parę pomysłów, które będą sukcesywnie odpalane teraz zostaje tylko kwestia czasu, chęci i samozaparcia.
Najważniejsze z nich są opisane powyżej jest jeszcze parę pobocznych. Może dobrym pomysłem jest implementacja swoich własnych Trzech poziomów?