Autor Beitrag
toom
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 30.12.14 21:04 
Hallo,

ich beschäftige mich zur Zeit mit den Coding Dojos der Clean Code Developer School. ccd-school.de/coding-dojo/#functionkatas

Für mich als Anfänger finde ich das ganze relativ schwer umzusetzen(Clean Code, TDD).

Deswegen übe ich mich gerade an der Function Kata "Russische Bauernmultiplikation"

Der Entwurf
www.bilder-upload.eu...6c979-1419965599.png


Die Implementation
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
public class Multiplikation
    {
        public int Mul(int x, int y)
        {
            var anzahl = AnzahlMöglicheTeilungen(x);
            var zahlenX = ZahlenErmitteln(x, anzahl, ZahlHalbieren);
            var zahlenY = ZahlenErmitteln(y, anzahl, ZahlVerdoppeln);
            var zahlen = WerteVergleichen(zahlenX, zahlenY);        
            return ZahlenAddieren(zahlen);
        }

        internal int AnzahlMöglicheTeilungen(int x)
        {
            return Convert.ToInt16(Math.Log(Convert.ToDouble(x)) / Math.Log(2.0));
        }

        internal IEnumerable<int> ZahlenErmitteln(int wert, int anzahl, Func<intint>NeuerWert)
        {
            IList<int> liste = new List<int>();
            int i = 0;
            while (i < anzahl)
            {
                liste.Add(wert);
                wert = NeuerWert(wert);
                i++;
            }
            return liste;
        }

        internal int ZahlHalbieren(int wert)
        {
            return wert / 2;
        }

        internal int ZahlVerdoppeln(int wert)
        {
            return wert * 2;
        }

        internal IEnumerable<int> WerteVergleichen(IEnumerable<int> x, IEnumerable<int> y)
        {
            List<int> liste = new List<int>();
            for (int i = 0; i < x.Count(); i++)
            {
                if (x.ElementAt(i) % 2 != 0)
                {
                    liste.Add(y.ElementAt(i));
                }
            }
            return liste;
        }

        internal int ZahlenAddieren(IEnumerable<int> zahlen)
        {
            return zahlen.Sum();
        }
    }  


    [TestClass]
    public class MultiplikationTests
    {
        Multiplikation sut;
        int[] x;
        int[] y;

       [TestInitialize]
        public void Init()
        {
            sut = new Multiplikation();
            x = new int[] { 472311521 };
            y = new int[] { 42841683366721344 };
        }


       [TestMethod]
       public void DoppelterWertEinerGanzzahl()
       {
           var erg = sut.ZahlVerdoppeln(8);
           Assert.AreEqual(16, erg);
       }

       [TestMethod]
       public void HalbierterWertEinerGanzzahl()
       {
           var erg = sut.ZahlHalbieren(8);
           Assert.AreEqual(4, erg);
       }

       [TestMethod]
       public void AnzahlTeilungenGanzzahlBisErgebnisIst1()
       {
           var erg = sut.AnzahlMöglicheTeilungen(47);
           Assert.AreEqual(6, erg);
       }

       [TestMethod]
       public void ZahlenErmittelnFürX()
       {
           var erg = sut.ZahlenErmitteln(476, sut.ZahlHalbieren);
           CollectionAssert.AreEqual(x, erg.ToArray());
       }

       [TestMethod]
       public void ZahlenErmittelnFürY()
       {
           var erg = sut.ZahlenErmitteln(426, sut.ZahlVerdoppeln);
           CollectionAssert.AreEqual(y, erg.ToArray());
       }

      [TestMethod]
       public void WennWerteXgeradeWertInYnichtBeachten()
       {
          var erg = sut.WerteVergleichen(x, y);
          Assert.AreEqual(5, erg.Count());
          CollectionAssert.AreEqual(new int[] { 42841683361344 }, erg.ToArray());
       }

       [TestMethod]
       public void ListeMitGanzzahlenAddieren()
       {
          var erg = sut.ZahlenAddieren(new int[] { 23545 });
          Assert.AreEqual(55, erg);
       }

       [TestMethod]
       public void Integrationstest()
       {
           var erg = sut.Mul(4742);
           Assert.AreEqual(1974, erg);
       }

       [TestCleanup]
       public void Cleanup()
       {
           sut = null;
       }
    }


Ich denke da kann man einiges besser oder "richtiger" machen. Habt ihr Tipps, Anregungen ect. oder werden mehr Infos benötigt?

Hat evtl. jemand diese Katas schon gemacht oder war soger bei einem Kurs dabei?

Gruß