All we do is looking for some way to fulfill our needs.

pi膮tek, 27 maja 2011

Tagged under: , , ,

Naturalny porz膮dek refaktoryzacji pod lup膮 cz. 1

(Rozwini臋cie tego wpisu powinno pojawi膰 si臋 w najbli偶szym SDJ http://sdjournal.pl/)


Refaktoryzacja to odwieczny (to chyba nie najlepsze s艂owo jak na kr贸tki czas funkcjonowania dyscypliny in偶ynierii oprogramowania ;-)) problem - bo wszyscy wiedz膮, 偶e powinno si臋 to robi膰, a nikt nie ma na to czasu. 
Jak ju偶 zaczniesz refaktoryzowa膰, najcz臋艣ciej nie wystarczy po prostu refaktoryza膰, bo 艂atwo wpa艣膰 w sza艂 refaktoryzacji, kt贸ry polega na refaktoryzowaniu wszystkiego i za wszelk膮 cen臋. Przedstawi臋 poni偶ej strategi臋 refaktoryzacji, kt贸ra w spos贸b systemowy pozwala podej艣膰 do tego cz臋sto niewdzi臋cznego zadania, jednocze艣nie przyczyniaj膮c si臋 do ewolucyjnego rozwoju projektu i architektury. Podpowiada te偶, jak si臋 zabra膰 za kod odziedziczony i zacz膮膰 go refaktoryzowa膰. Oto magiczne punkty:
1.   Zacznij od prostego rozwi膮zania, zgodnie zasad膮 Keep it simple stupid. Nie my艣l zbyt du偶o o wzorcach, o wprowadzaniu wszelkiej mo偶liwej elastyczno艣ci.
2.   Z du偶ych metod zaczynaj wyodr臋bnia膰 mniejsze sk艂adowe metody (refaktoryzacja Extract Method). D膮偶 do realizacji wzorca Compose Method – niech Twoja g艂贸wna metoda sk艂ada si臋 z serii wywo艂a艅 mniejszych metod.
3.   Kiedy Twoje klasy b臋d膮 sk艂ada艂y si臋 z du偶ej ilo艣ci ma艂ych metod, zacznij analizowa膰 odpowiedzialno艣膰 klasy. Przesu艅 metody, kt贸re realizuj膮 inne odpowiedzialno艣ci do bardziej odpowiednich dla nich klas.
4.   Z czasem zaczynasz dostrzega膰, 偶e w Twoich rozwi膮zaniach potrzeba elastyczno艣ci – zacznij wprowadza膰 wzorce projektowe, tam gdzie potrzeba.
5.   Raz na jaki艣 czas (raz na kilka miesi臋cy przy wi臋kszych projektach), analizuj to, co dzieje si臋 z Twoim projektem. Architektura wymaga regularnego od艣wie偶ania i wprowadzania zmian, aby przystawa艂a do pojawiaj膮cych si臋 wymaga艅.


Za艂贸偶my, 偶e mamy napisan膮 klas臋 udost臋pniaj膮c膮 metod膮 s艂u偶膮c膮 do zaciemniania tekstu, b臋d膮cego parametrem metody. Przyk艂adowy kod znajdziesz na poni偶ej.
public class TextManager
{
    private TextManagerHelper _hlp = null;
    // ...
    public TextManager(TextManagerHelper _helper)
    {
        this._hlp = _helper;
    }

    private Random rnd = new Random();

    public string Convert(string text)
    {
        String result = "";
        List<TextPart> prts = _hlp.Convert(text);

        for (int i = 0; i < prts.Count; i++)
        {
            if (prts[i].Type.Equals(TextPartType.WORD) && rnd.NextDouble() < 0.2)
            {
                if (i + 2 < prts.Count)
                {
                    TextPart t = prts[i];
                    prts[i] = prts[i + 2];
                    prts[i + 2] = t;
                }
            }
        }

        for(int i1 = 0; i1 < prts.Count; i1++)
        {
            if (rnd.NextDouble() < 0.2)
            {
                prts.Insert(i1, new TextPart(" ", TextPartType.NONWORD)); i1++;
                String[] wds = new String[] { "i", "a", "aczkolwiek", "poniek膮d" };
                int ind = rnd.Next(wds.Length);
                prts.Insert(i1, new TextPart(wds[ind], TextPartType.WORD)); i1++;
                prts.Insert(i1, new TextPart(" ", TextPartType.NONWORD));
            }
        }

        String result2 = "";

        foreach (TextPart part in prts)
        {
            result2 += part.Contents;
        }

        result = result2;
        result = Regex.Replace(result, @"[\?!-\.,:;'\(\)]", "", RegexOptions.CultureInvariant);

        String result1 = "";

        for ( int i2 = 0; i2 < result.Split(' ').Length - 1; i2++)
        {
            if (rnd.NextDouble() < 0.5)
            {
                char [] chs = new char[] { '.', ',', '!' };
                int j = rnd.Next(chs.Length);
                result1 += result.Split(' ')[i2] + chs[j];
            }
            else
            {
                result1 += result.Split(' ')[i2] + " ";
            }
        }
        result1 += result.Split(' ')[result.Split(' ').Length - 1];
        result = result1;

        result = result
            .Replace("膮", "a")
            .Replace("艂", "l")
            .Replace("臋", "e")
            .Replace("艅", "n")
            .Replace("偶", "z")
            .Replace("藕", "z")
            .Replace("贸", "o")
            .Replace("艣", "s")
            .Replace("膰", "c")
            .Replace("膭", "A")
            .Replace("艁", "L")
            .Replace("臉", "E")
            .Replace("艃", "N")
            .Replace("呕", "Z")
            .Replace("殴", "Z")
            .Replace("脫", "O")
            .Replace("艢", "S");

        String result3 = "";
        char[] tArray = result.ToCharArray();

        foreach (char ch in tArray) {
            if (rnd.NextDouble() < 0.3)
            {
                char? newCh = null;
                if (Char.IsLower(ch))
                {
                    newCh = Char.ToUpper(ch);
                } else
                {
                    newCh = Char.ToLower(ch);
                }

                result3 += newCh;
            }
            else
            {
                result3 += ch;
            }
        }

        result = result3.Replace(" ", "");

        return result;
    }
}



C. D. N.