<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=48&amp;t=14313&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-01-26T18:36:34+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=48&amp;t=14313&amp;mode</id>
<entry>
<author><name><![CDATA[komandos332]]></name></author>
<updated>2016-01-26T18:36:34+01:00</updated>
<published>2016-01-26T18:36:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14313&amp;p=151812#p151812</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14313&amp;p=151812#p151812"/>
<title type="html"><![CDATA[Re: Visual C# - Krótszy kod nie znaczy lepszy?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14313&amp;p=151812#p151812"><![CDATA[
Już wyjaśniam<br /><br />Metoda GetAllGridObjects jest źle napisana, bo pętla while wykonuje się tyle razy ile jest sumarycznie obiektów co jest głupie, ponieważ powinna się wykonać tyle razy<br />ile obiektów ma najdłuższy Listing. Czyli jeśli childrenWire zawiera 100 elementów i to jest najwięcej, np childrenSquare ma tylko 20 elementów to pętla się powinna wykonać 100 razy, nie mniej i nie więcej. Aktualnie to działa tak, że jeśli listing childrenWire ma 100 elementów a childrenSquare 20, pętla wykonuje się 120 razy - głupota! Nie ma to jednak super mega wielkiego znaczenia, ponieważ ile można umieścić na stronie. Ta liczba nie przekracza nigdy 60 elementów z wszystkich listingów w sumie!<br /><br />Z tym try{} catch{} jest tak, że jak mam wszystko osobno to w przypadku błędu ominie mi tylko jeden listing. Jeśli bym dał wszystkie listingi do jednego try'a to wtedy<br />jeżeli w pierwszym z góry listingu wywali wyjątek, to przechodzi do instrukcji catch{} pomijając całą resztę i w rezultacie tracę całą resztę o aktualnie przzeszukiwanym indeksie.<br /><br />Zarówno metoda GetAlGridObject() jak i FindAll zwraca List&lt;object&gt;. Nie wiem czy te metody wykonują się z każdy &quot;obrotem&quot; pętli foreach czy też działa to tak,<br />że tylko raz wykonuje te metody i w następnym obiegu pętli w tamtym miejscu już jest poprzednio zwrócony listing i tylko leci po indeksach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4299">komandos332</a> — 26 sty 2016, o 18:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marmur]]></name></author>
<updated>2016-01-26T18:08:55+01:00</updated>
<published>2016-01-26T18:08:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14313&amp;p=151804#p151804</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14313&amp;p=151804#p151804"/>
<title type="html"><![CDATA[Re: Visual C# - Krótszy kod nie znaczy lepszy?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14313&amp;p=151804#p151804"><![CDATA[
Specem od C# nie jestem, ale na pewno nie musisz każdej instrukcji &quot;try-catchować&quot; wystarczy jeden obejmujący całość operacji, jak gdzieś wyskoczy wyjątek to Ci go ładnie złapie. Ten try-catch może chyba w sobie nawet obejmować całe ciało pętli.<br /><br />Zapisy w stylu foreach z reguły są wolniejsze niż zwykłe fory czy while.<br /><br />Nie wiem jak dokładnie działa foreach w C#, ale próbowałeś może kolekcję wrzucić do zmiennej przed foreach i po niej iterować? Być może problemem jest ciągła potrzeba wykonania &quot;findAll&quot; ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10570">marmur</a> — 26 sty 2016, o 18:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[komandos332]]></name></author>
<updated>2016-01-26T17:48:30+01:00</updated>
<published>2016-01-26T17:48:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14313&amp;p=151802#p151802</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14313&amp;p=151802#p151802"/>
<title type="html"><![CDATA[Visual C# - Krótszy kod nie znaczy lepszy?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14313&amp;p=151802#p151802"><![CDATA[
Witam<br /><br />Podczas tworzenia pewnego kodu zaczęła mnie irytować jego obszerność w związku z czym postanowiłem go troszkę uprościć.<br />Napotkałem się przy tym jak dla mnie, na ciekawą zagwozdkę. Mam kila różnych klas, z których każda ma metodę<br />o nazwie <span style="color: #408000">Move ( PoinF p );</span> i wiele innych metod o tej samej nazwie.<br />Na początku, kod do przemieszczania obiektów wyglądał tak:<br /><br /><strong>UWAGA!</strong> &quot;ify&quot; są pod komentarzem ponieważ wcześniej ich nie było.<br /><br />[syntax=csharp]// if ( selectedObject is Relay || selectedObjects.Contains ( typeof ( Relay ) ) || ModifierKeys == Keys.Control )<br />                    for ( int i = 0; i &lt;= gridList&#91;actualGrid&#93;.childrenRelay.Count - 1; i++ )<br />                    {<br /><br />                        Relay relay = (Relay)gridList&#91;actualGrid&#93;.childrenRelay&#91;i&#93;;<br />                        if ( relay.Selected )<br />                        {<br />                            relay.Move ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                        }<br /><br />                        if ( relay.TableSelected )<br />                        {<br />                            relay.MoveTable ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                        }<br />                    }<br /><br />               // if ( selectedObject is RelaySlave || selectedObjects.Contains ( typeof ( RelaySlave ) ) || ModifierKeys == Keys.Control )<br />                    for ( int i = 0; i &lt;= gridList&#91;actualGrid&#93;.childrenRelaySlave.Count - 1; i++ )<br />                    {<br /><br />                        RelaySlave relaySlave = (RelaySlave)gridList&#91;actualGrid&#93;.childrenRelaySlave&#91;i&#93;;<br />                        if ( relaySlave.Selected )<br />                        {<br />                            relaySlave.Move ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                        }<br />                    }<br /><br />               // if ( selectedObject is CircuitBreaker || selectedObjects.Contains ( typeof ( CircuitBreaker ) ) || ModifierKeys == Keys.Control )<br />                    for ( int i = 0; i &lt;= gridList&#91;actualGrid&#93;.childrenCircuitBreaker.Count - 1; i++ )<br />                    {<br />                        if ( gridList&#91;actualGrid&#93;.childrenCircuitBreaker&#91;i&#93;.Selected )<br />                        {<br />                            gridList&#91;actualGrid&#93;.childrenCircuitBreaker&#91;i&#93;.Move ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                        }<br />                    }<br /><br />               // if ( selectedObject is Lamp || selectedObjects.Contains ( typeof ( Lamp ) ) || ModifierKeys == Keys.Control )<br />                    for ( int i = 0; i &lt;= gridList&#91;actualGrid&#93;.childrenLamp.Count - 1; i++ )<br />                    {<br />                        if ( gridList&#91;actualGrid&#93;.childrenLamp&#91;i&#93;.Selected )<br />                        {<br />                            gridList&#91;actualGrid&#93;.childrenLamp&#91;i&#93;.Move ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                        }<br />                    }<br /><br />               // if ( selectedObject is MainSwitch || selectedObjects.Contains ( typeof ( MainSwitch ) ) || ModifierKeys == Keys.Control )<br />                    for ( int i = 0; i &lt;= gridList&#91;actualGrid&#93;.childrenMainSwitch.Count - 1; i++ )<br />                    {<br />                        if ( gridList&#91;actualGrid&#93;.childrenMainSwitch&#91;i&#93;.Selected )<br />                        {<br />                            gridList&#91;actualGrid&#93;.childrenMainSwitch&#91;i&#93;.Move ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                        }<br />                    }<br /><br />              //  if ( selectedObject is FrontSwitch || selectedObjects.Contains ( typeof ( FrontSwitch ) ) || ModifierKeys == Keys.Control )<br />                    for ( int i = 0; i &lt;= gridList&#91;actualGrid&#93;.childrenFronSwitch.Count - 1; i++ )<br />                    {<br />                        if ( gridList&#91;actualGrid&#93;.childrenFronSwitch&#91;i&#93;.Selected )<br />                        {<br />                            gridList&#91;actualGrid&#93;.childrenFronSwitch&#91;i&#93;.Move ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                        }<br />                    }<br /><br />              //  if ( selectedObject is SensorSwitch || selectedObjects.Contains ( typeof ( SensorSwitch ) ) || ModifierKeys == Keys.Control )<br />                    for ( int i = 0; i &lt;= gridList&#91;actualGrid&#93;.childrenSensorSwitch.Count - 1; i++ )<br />                    {<br />                        if ( gridList&#91;actualGrid&#93;.childrenSensorSwitch&#91;i&#93;.Selected )<br />                        {<br />                            gridList&#91;actualGrid&#93;.childrenSensorSwitch&#91;i&#93;.Move ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                        }<br />                    }<br /><br />               // if ( selectedObject is DescriptionText || selectedObjects.Contains ( typeof ( DescriptionText ) ) || ModifierKeys == Keys.Control )<br />                    for ( int i = 0; i &lt;= gridList&#91;actualGrid&#93;.childrenText.Count - 1; i++ )<br />                    {<br />                        if ( gridList&#91;actualGrid&#93;.childrenText&#91;i&#93;.Selected )<br />                        {<br />                            gridList&#91;actualGrid&#93;.childrenText&#91;i&#93;.Move ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                        }<br />                    }<br /><br />               // if ( selectedObject is Square || selectedObjects.Contains ( typeof ( Square ) ) || ModifierKeys == Keys.Control )<br />                    for ( int i = 0; i &lt;= gridList&#91;actualGrid&#93;.childrenSquare.Count - 1; i++ )<br />                    {<br />                        if ( gridList&#91;actualGrid&#93;.childrenSquare&#91;i&#93;.Selected )<br />                        {<br />                            gridList&#91;actualGrid&#93;.childrenSquare&#91;i&#93;.Move ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                        }<br />                    }<br /><br />               // if ( selectedObject is ObjectImage || selectedObjects.Contains ( typeof ( ObjectImage ) ) || ModifierKeys == Keys.Control )<br />                    for ( int i = 0; i &lt;= gridList&#91;actualGrid&#93;.childrenImage.Count - 1; i++ )<br />                    {<br />                        if ( gridList&#91;actualGrid&#93;.childrenImage&#91;i&#93;.Selected )<br />                        {<br />                            gridList&#91;actualGrid&#93;.childrenImage&#91;i&#93;.Move ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                        }<br />                    }<br /><br />               // if ( selectedObject is Ellipse || selectedObjects.Contains ( typeof ( Ellipse ) ) || ModifierKeys == Keys.Control )<br />                    for ( int i = 0; i &lt;= gridList&#91;actualGrid&#93;.childrenEllipse.Count - 1; i++ )<br />                    {<br />                        if ( gridList&#91;actualGrid&#93;.childrenEllipse&#91;i&#93;.Selected )<br />                        {<br />                            gridList&#91;actualGrid&#93;.childrenEllipse&#91;i&#93;.Move ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                        }<br />                    }<br /><br />                //if ( selectedObject is Cable || selectedObjects.Contains ( typeof ( Cable ) ) || ModifierKeys == Keys.Control )<br />                    for ( int i = 0; i &lt;= gridList&#91;actualGrid&#93;.childrenCable.Count - 1; i++ )<br />                    {<br />                        if ( gridList&#91;actualGrid&#93;.childrenCable&#91;i&#93;.Selected )<br />                        {<br />                            gridList&#91;actualGrid&#93;.childrenCable&#91;i&#93;.Move ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                        }<br />                    }<br /><br />                <br /><br />               // if ( selectedObject is UserObject || selectedObjects.Contains ( typeof ( UserObject ) ) || ModifierKeys == Keys.Control )<br />                    for ( int i = 0; i &lt;= gridList&#91;actualGrid&#93;.childrenUserObject.Count - 1; i++ )<br />                    {<br />                        if ( gridList&#91;actualGrid&#93;.childrenUserObject&#91;i&#93;.Selected )<br />                        {<br />                            gridList&#91;actualGrid&#93;.childrenUserObject&#91;i&#93;.Move ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                        }<br />                    }[/syntax]<br /><br />Duży, tłusty i rozlazły, jak się wydawało niepotrzebnego kodu. Pomyślałem sobie, że skoro każda z tych klas ma nazwe <span style="color: #408000">Move ( PoinF p );</span> to pyknę ją i resztę wspólnych metod do interfejsu. Całość o identycznym działaniu zawarłem w takim kodzie:<br /><br />[syntax=csharp]foreach ( object obj in ( gridList&#91;actualGrid&#93;.GetAllGridObjects ( ) ).FindAll ( i =&gt; ( i as BasicObject ).Selected ) )<br />                {<br />                     if ( !( obj is Wire ) &amp;&amp; !( obj is Line ) &amp;&amp; !( obj is CableClamp ) )<br />                          ( obj as IBasics ).Move ( gridList&#91;actualGrid&#93;.ActualGridPoint );<br />                }[/syntax]<br /><br />I tu niespodzianka. Program zaczął klatkować podczas przemieszczania obiektów. Moje pytanie brzmi, dlaczego?<br /><br />Tak wygląda metoda GetAllGridObiects ( ); - Też źle napisana wiem. Zmienię to, mimo wszystko nie jest tak obszerna, żeby w takim stopniu<br />zwalniać procek. Jaka jest różnica czasu wykonywania kodu? Za pomocą klasy Stopwatch zmierzyłem, że wykonywanie się długiego, obrzydliwego<br />i przerażającego kodu wynosi mniej niż 1 ms. Zaś czas wykonywania krótkiego foreach trwa nawet 10ms!?!?!?! Czy metoda FindAll jest tak prockożerna?<br /><br />[syntax=csharp]public List&lt;object&gt; GetAllGridObjects ( )<br />        {<br />            AllGridObjects = new List&lt;object&gt; ( );<br />            int index = 0, passedAdd = 0;<br /><br />            int totalItemsCount = childrenCircuitBreaker.Count<br />                + childrenFronSwitch.Count<br />                + childrenMainSwitch.Count<br />                + childrenRelay.Count<br />                + childrenRelaySlave.Count<br />                + childrenSensorSwitch.Count<br />                + childrenSquare.Count<br />                + childrenLine.Count<br />                + childrenText.Count<br />                + childrenWire.Count<br />                + childrenEllipse.Count<br />                + childrenUserObject.Count<br />                + childrenCable.Count<br />                + childrenCableClamp.Count<br />                + childrenLamp.Count<br />                + childrenImage.Count;<br /><br />            while ( passedAdd != totalItemsCount )<br />            {<br />                try { AllGridObjects.Add ( childrenCircuitBreaker&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenFronSwitch&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenMainSwitch&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenRelay&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenRelaySlave&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenSensorSwitch&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenSquare&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenText&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenWire&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenLine&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenEllipse&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenUserObject&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenCable&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenCableClamp&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenLamp&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                try { AllGridObjects.Add ( childrenImage&#91;index&#93; ); passedAdd++; }<br />                catch { }<br />                index++;<br />            }<br />            return AllGridObjects;<br />        }[/syntax]<br /><br />Pozdrawiam, Maciek.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4299">komandos332</a> — 26 sty 2016, o 17:48</p><hr />
]]></content>
</entry>
</feed>