Optimális kód Layout Mathematica?

szavazat
5

Én már láttam a különböző elegáns módon kódra ezen a fórumon.

Mint kezdő, azt szeretné, hogy a tanácsokat a legjobb módja annak, hogy kódra, mint alább.

Ez csúnya, nem optimális, sőt valószínűleg hülye, de a szakértő programozók bocsánat, én használni, mint egy „legrosszabb forgatókönyv”.

A cél a kezdő vagyok a világosság.

rejection[disp_, fixationNOtoConsiderForDuration_, durationLimit_, 
 minDistance_] :=

With[{fakedata = consider[t4dataLAEH10, 9, disp, {17, 18, 11}]},

With[{num = 
 Flatten[Position[
   Take[fakedata[[All, 3]], fixationNOtoConsiderForDuration], 
   x_ /; (x > durationLimit)]]},

If[num =!= {},
With[{fakedata1 = Drop[fakedata[[All, {1, 2}]], Last@num]},
 With[{num1 =
    Flatten[Position[
      Table[     
       Sqrt[((fakedata1[[fixation1, 1]] - 
           centerX)^2 + (fakedata1[[fixation1, 2]] - 
           centerY)^2)],
       {fixation1, 1, Length@fakedata1}], 
      x_ /; (x < minDistance)]]},

  If[num1 =!= {},
   Delete[fakedata1[[All, {1, 2}]], List /@ num1], 
   fakedata[[All, {1, 2}]]]]],
With[{fakedata2 = fakedata[[All, {1, 2}]]},  
 With[{num2 =
    Flatten[Position[
      Table[       
       Sqrt[((fakedata2[[fixation2, 1]] - 
           centerX)^2 + (fakedata2[[fixation2, 2]] - 
           centerY)^2)],
       {fixation2, 1, Length@fakedata2}], 
      x_ /; (x < minDistance)]]},
  If[num2 =!= {},
   Delete[fakedata2[[All, {1, 2}]], List /@ num2], 
   fakedata[[All, {1, 2}]]]]]]]]

írja

A kérdést 12/06/2011 13:39
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
3

Van egy mondás, „nem lehet okos”, vagyis inkább tisztaságát fenti kódot más prioritások, ha lehetséges. Néhány nap valaki újra ezt a kódot, és ő fogja értékelni tudjuk, mi a kód csinál. Ez összefügg a formázás (méret az érthetőség kedvéért), de fészkel a funkció hívásokat. Ez könnyen írni nagyon beágyazott érthetetlen kódot Mathematica. Annak érdekében, hogy a dolgok egyértelműek, én inkább használni átmeneti vagy köztes változók és felbontja az én hosszú, egymásba függvényhívásokkal apró értelmes darabokat. Még ha újra a változó, akkor sokkal könnyebb követni a lépéseket, vagy helyezze Print [] 's ott, hogy mi folyik az egyes lépéseknél. Segédfüggvényünk is jók.

Egy formázási szempontból, én inkább hasonló formátumban:

   If[test, 
        expr1, 
   (* ELSE *)
        expr2
    ]

Saját korábbi megjegyzés azt jelenti, hogy én inkább a több vonal helyett sok hosszú beágyazott dolgok, ami miatt szintén teszi a formázás egyszerűbb. Próbálja tartani kif1 / expr2 kevesebb mint körülbelül 80 karakter. Azt hiszem, ez egy ésszerű és tisztességes vizsgálat, ha ez már túl hosszú. Ezek csak irányelveket, lehet és kell törött időnként, de azt hiszem, ők hasznos, és reméljük, hasznosnak találják őket is.

* UPDATE *

Ez hogyan lenne tisztán formázni ezt a kódot .... Megjegyzés: a meglehetősen hosszú sorok ...

rejection[disp_, fixationNOtoConsiderForDuration_, durationLimit_, minDistance_] :=    
With[{fakedata = consider[t4dataLAEH10, 9, disp, {17, 18, 11}]},
    With[{num = Flatten[Position[Take[fakedata[[All, 3]], fixationNOtoConsiderForDuration], x_ /; (x > durationLimit)]]},

        If[num =!= {},
            With[{fakedata1 = Drop[fakedata[[All, {1, 2}]], Last@num]},
                With[{num1 = Flatten[Position[Table[Sqrt[((fakedata1[[fixation1, 1]] - centerX)^2 + (fakedata1[[fixation1, 2]] - centerY)^2)], {fixation1, 1, Length@fakedata1}], x_ /; (x < minDistance)]]},
                    If[num1 =!= {},
                        Delete[fakedata1[[All, {1, 2}]], List /@ num1],
                    (* ELSE *) 
                        fakedata[[All, {1, 2}]]
                    ]
                ]
            ],
        (* ELSE *)
            With[{fakedata2 = fakedata[[All, {1, 2}]]},  
                With[{num2 = Flatten[Position[Table[Sqrt[((fakedata2[[fixation2, 1]] - centerX)^2 + (fakedata2[[fixation2, 2]] - centerY)^2)], {fixation2, 1, Length@fakedata2}], x_ /; (x < minDistance)]]},
                    If[num2 =!= {},
                        Delete[fakedata2[[All, {1, 2}]], List /@ num2],
                    (* ELSE *) 
                        fakedata[[All, {1, 2}]]
                    ]
                ]
            ]
        ]
    ]
]

Több érintett újratervezés:

(* Try to put types on these variables. It'll be easier to identify what's going in *)
rejection[disp_, fixationNOtoConsiderForDuration_, durationLimit_, minDistance_] := 
Module[{fakedata, num1, fakedata1, num, fakedata2, num2},
    fakedata = consider[t4dataLAEH10, 9, disp, {17, 18, 11}];
    num = Flatten[Position[Take[fakedata[[All, 3]], fixationNOtoConsiderForDuration], x_ /; (x > durationLimit)]];
    If[num =!= {}, 
        fakedata1 = Drop[fakedata[[All, {1, 2}]], Last@num];
        num1 = Table[Sqrt[((fakedata1[[fixation1, 1]] - centerX)^2 + (fakedata1[[fixation1, 2]] - centerY)^2)], {fixation1, 1, Length@fakedata1}];
        num1 = Flatten[Position[num1, x_ /; (x < minDistance)]];
        If[num1 =!= {},
            Delete[fakedata1[[All, {1, 2}]], List /@ num1],
        (* ELSE *) 
            fakedata[[All, {1, 2}]]
        ], 
    (* ELSE *)
        fakedata2 = fakedata[[All, {1, 2}]];
        num2 = Table[Sqrt[((fakedata2[[fixation2, 1]] - centerX)^2 + (fakedata2[[fixation2, 2]] - centerY)^2)], {fixation2, 1, Length@fakedata2}];
        num2 = Flatten[Position[num2, x_ /; (x < minDistance)]];
        If[num2 =!= {},
            Delete[fakedata2[[All, {1, 2}]], List /@ num2],
        (* ELSE *) 
            fakedata[[All, {1, 2}]]
        ]           
    ]
]

Jelenleg több változó van, mint amennyi szükséges, és nem vagyok elégedett a NUM1 / 2 = táblázat [] sort. Ez még mindig egy hosszú és én valószínűleg vagy megpróbál egy segítő funkciót belőle vagy használja Normál [], amely úgy tűnik, hasonlóan ahhoz, amit a kód akar csinálni.

Válaszolt 12/06/2011 14:39
a forrás felhasználó

szavazat
5
  • Abban az esetben, a fenti kódot, én szét a Flatten[Position[...]]ki egy külön funkció.

  • Én is használni egy felmérő konstrukció helyett egy beágyazott With.

mint:

Block[{fakedata, fakedata1, fakedata2, num, result},
  fakedata = ...;
  num = ...;

  If[num =!= {},
    fakedata1 = ...;
    result = localPoints[fakedata1];
    ];

  num1 = ...;
  If[num1 =!= {},
    fakedata2 = ...;
    result = localPoints[fakedata2];
    ];

  result
  ]
  • Nem szeretem használni szedés (indexek, felsőindexeket, négyzetgyök, stb ...) a kód, mert számomra ez inkább egy szöveges környezetben (legyen Workbench, vagy e-mailben, vagy az interneten, ... ) Bárhol máshol, ez tisztességes játék.
Válaszolt 12/06/2011 19:33
a forrás felhasználó

szavazat
3

Úgy döntöttem, hogy nem egy teljes újraírása, mert az eredeti egyszerűen túl messze a saját stílusát, hogy formázza azt tenném a saját kódját.

Nem próbálja tesztelni, úgyhogy ez teljesen lehetséges valami elromlott, de úgy vélem, hogy a legtöbb helyes-e.

ÉN használ szöveg sejteket leírni a szintaxis én funkciókat. Én általában beágyazni (* comments *), hogy ismertesse a kódot, de ha a magyarázatok nagyon hosszú, azt mozgatni őket Text sejteket is.

Én is egy megjegyzést elmagyarázza func1. Ez nem egy nagyon hasznos megjegyzést, de példaként szolgál.

Itt van egy kép az én notebook 75% nagyítás:

írja kép leírása itt

Cell kifejezés másolás és beillesztés:

Cell[CellGroupData[{Cell["Rewrite", "Subsection"],

Cell[TextData[{
 StyleBox["distance", "Program"],
 "[{",
 StyleBox["x1",
  FontSlant->"Italic"],
 ", ",
 StyleBox["y1",
  FontSlant->"Italic"],
 "}] gives EuclideanDistance from {x1, y1} to global {centerX, \
centerY}\n",
 StyleBox["distance", "Program"],
 "[{",
 StyleBox["x1",
  FontSlant->"Italic"],
 ", ",
 StyleBox["y1",
  FontSlant->"Italic"],
 "}, {",
 StyleBox["x2",
  FontSlant->"Italic"],
 ", ",
 StyleBox["y2",
  FontSlant->"Italic"],
 "}] gives EuclideanDistance from {x1, y1} to {x2, y2}"
}], "Text"],

Cell[BoxData[
 RowBox[{
  RowBox[{"distance", "[", 
   RowBox[{"a_", ",", 
    RowBox[{"b_:", 
     RowBox[{"Hold", "@", 
      RowBox[{"{", 
       RowBox[{"centerX", ",", "centerY"}], "}"}]}]}]}], "]"}], ":=", 
  RowBox[{"EuclideanDistance", "[", 
   RowBox[{"a", ",", 
    RowBox[{"ReleaseHold", "@", "b"}]}], "]"}]}]], "Input"],

Cell[TextData[{
 StyleBox["rejection", "Program"],
 "[",
 StyleBox["disp, fixation, durationLimit, minDistance",
  FontSlant->"Italic"],
 "]\n\nfilters data from ",
 StyleBox["t4dataLAEH10", "Program"],
 " according to:\n\t",
 StyleBox["disp",
  FontSlant->"Italic"],
 " : (description of argument disp)\n\t",
 StyleBox["fixation",
  FontSlant->"Italic"],
 " : (description of argument fixation)\n\t",
 StyleBox["durationLimit",
  FontSlant->"Italic"],
 " : (description of durationLimit)\n\t",
 StyleBox["minDistance",
  FontSlant->"Italic"],
 " : (description of minDistance)"
}], "Text"],

Cell[BoxData[
 RowBox[{
  RowBox[{"rejection", "[", 
   RowBox[{
   "disp_", ",", "fixation_", ",", "durationLimit_", ",", 
    "minDistance_"}], "]"}], ":=", "\[IndentingNewLine]", 
  RowBox[{"Module", "[", 
   RowBox[{
    RowBox[{"{", 
     RowBox[{"fakedata", ",", "num", ",", "func1"}], "}"}], ",", 
    "\[IndentingNewLine]", 
    RowBox[{"(*", " ", 
     RowBox[{"description", " ", "of", " ", "fakedata"}], " ", "*)"}],
     "\[IndentingNewLine]", 
    RowBox[{
     RowBox[{"fakedata", "=", 
      RowBox[{"consider", "[", 
       RowBox[{"t4dataLAEH10", ",", "9", ",", "disp", ",", 
        RowBox[{"{", 
         RowBox[{"17", ",", "18", ",", "11"}], "}"}]}], "]"}]}], ";", 
     "\[IndentingNewLine]", "\[IndentingNewLine]", 
     RowBox[{"(*", " ", 
      RowBox[{"description", " ", "of", " ", "num"}], " ", "*)"}], 
     "\[IndentingNewLine]", 
     RowBox[{"num", "=", 
      RowBox[{"Position", "[", 
       RowBox[{
        RowBox[{
         RowBox[{"fakedata", "\[LeftDoubleBracket]", 
          RowBox[{"All", ",", "3"}], "\[RightDoubleBracket]"}], "~", 
         "Take", "~", "fixation"}], ",", 
        RowBox[{"x_", "/;", 
         RowBox[{"x", ">", "durationLimit"}]}]}], "]"}]}], ";", 
     "\[IndentingNewLine]", "\[IndentingNewLine]", 
     RowBox[{"(*", " ", 
      RowBox[{
       RowBox[{"func1", ":", " ", 
        RowBox[{
        "Take", " ", "the", " ", "first", " ", "two", " ", "columns", 
         " ", "of", " ", "fakedata"}]}], ",", " ", 
       RowBox[{
        RowBox[{
         RowBox[{
         "and", " ", "drop", " ", "rows", " ", "specified", " ", "by",
           " ", 
          RowBox[{
           StyleBox["dropspec",
            FontSlant->"Italic"], ".", "\[IndentingNewLine]", 
           "Delete"}], " ", "any", " ", "rows", " ", "for", " ", 
          "which", " ", 
          StyleBox["distance", "Program"]}], " ", "<", " ", 
         StyleBox["minDistance",
          FontSlant->"Italic"]}], ";", " ", 
        RowBox[{
        "if", " ", "no", " ", "rows", " ", "are", " ", "deleted"}]}], 
       ",", "\[IndentingNewLine]", "   ", 
       RowBox[{
       "return", " ", "the", " ", "first", " ", "two", " ", "columns",
         " ", "of", " ", "fakedata"}], ",", " ", 
       RowBox[{"ignoring", " ", 
        RowBox[{"dropspec", "."}]}]}], 
      StyleBox[" ",
       FontSlant->"Italic"], "*)"}], "\[IndentingNewLine]", 
     RowBox[{
      RowBox[{"func1", "[", "dropspec_", "]"}], ":=", 
      RowBox[{"Module", "[", 
       RowBox[{
        RowBox[{"{", 
         RowBox[{"part", ",", "fake"}], "}"}], ",", 
        "\[IndentingNewLine]", 
        RowBox[{
         RowBox[{"part", "=", 
          RowBox[{"fakedata", "\[LeftDoubleBracket]", 
           RowBox[{"All", ",", 
            RowBox[{"{", 
             RowBox[{"1", ",", "2"}], "}"}]}], 
           "\[RightDoubleBracket]"}]}], ";", "\[IndentingNewLine]", 
         RowBox[{"fake", "=", 
          RowBox[{"part", "~", "Drop", "~", "dropspec"}]}], ";", 
         "\[IndentingNewLine]", 
         RowBox[{
          RowBox[{
           RowBox[{"If", "[", 
            RowBox[{
             RowBox[{"#", "=!=", 
              RowBox[{"{", "}"}]}], ",", 
             RowBox[{"fake", "~", "Delete", "~", "#"}], ",", "part"}],
             "]"}], "&"}], "@", "\[IndentingNewLine]", 
          RowBox[{"Position", "[", 
           RowBox[{
            RowBox[{"distance", "/@", "fake"}], ",", 
            RowBox[{"x_", "/;", 
             RowBox[{"x", "<", "minDistance"}]}]}], "]"}]}]}]}], 
       "]"}]}], ";", "\[IndentingNewLine]", "\[IndentingNewLine]", 
     RowBox[{"If", "[", 
      RowBox[{
       RowBox[{"num", "=!=", 
        RowBox[{"{", "}"}]}], ",", 
       RowBox[{"func1", " ", "@", " ", 
        RowBox[{"num", "\[LeftDoubleBracket]", 
         RowBox[{
          RowBox[{"-", "1"}], ",", "1"}], "\[RightDoubleBracket]"}]}],
        ",", 
       RowBox[{"func1", "@", "0"}]}], "]"}]}]}], " ", 
   "]"}]}]], "Input"]
}, Open  ]]
Válaszolt 13/06/2011 07:08
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more