C++, preferált visszatérési érték szintaxis
2021-03-12T19:59:31+01:00
2021-03-13T19:44:18+01:00
2022-07-20T11:16:56+02:00
  • Habár ez nem szerepelt a lehetőségeid között, de miért nem get_width() és get_height()? Ebben az esetben a hívó eldöntheti, hogy milyen struktúrába szeretné bepakolni. De ha viszont mindenképpen get_size()-ot akarsz, akkor szerintem egyértelműen a (4)-es, a std::pair-ben hülyén néz ki a .first és a , .second (mindig bele fog a hívó zavarodni, hogy melyik a szélesség és a melyik a hosszúság), a (3)-asnál pedig elég nehéz a típust kivarázsolni, ha pl. a hívó több ablakra kérdezi le és egy vector<Size>-t akar csinálni belőle, biztosan lehet valami vector<decltype ...> varázslattal megoldani, de nem egyszerű.
    Mutasd a teljes hozzászólást!
  • Ha van idő normális kódot írni és nem csak összecsapni valamit, akkor egyértelmű a dedikált típus a szép megoldás (biztonság, olvashatóság, stb..).

    Személyesen ezt tartom a legjobbnak, az olvashatóság és az egyértelműség nagyon hasznos.

    Size getSize() const { return { _width, _height}; }
    Privát adattagot mindig underscore-al prefix-elek, rövidebb és jobban olvasható számomra, de itt a 'm_' pont annyira helyes. A fontos, hogy kódbázison belül egységes style legyen használva.

    'noexcept'-et nem szoktam használni, lehet, hogy lenne értelme, de ezt inkább premature optimalizációnak érzem, ami potenciálisan nemvárt viselkedést is okozhat. Ott marad a 'noexcept', de közben olyan módosítás történt, hogy mégis dob...

    felhasználó oldalról 'auto'-t szoktam használni, amennyiben egyértelmű a típus akár a változó nevéből, akár a hívott függvény neve alapján.

    auto size = window.getSize();
    Mutasd a teljes hozzászólást!
  • Huhh get_size_4() > get_size_1().

    A get_size_2() és get_size_3() esetekben én csak az újabb feature-ök túltolását látom.

    2-es bosszantó mert a függvény belsejében kell turkálni (ami akár lehet nagy és bonyolult is), hogy kiderüljön, hogy mit is ad vissza.

    3-as pedig (túl) részletes ott, ahol semmit szükség rá (tudjuk, hogy melyik változó a width és melyik a height), vagyis belül.
    Ugyanakkor semmitmondó ott, ahol érdekes lenne (a hívás helyén), és semmi nem óv meg attól, hogy valaki felcserélje véletlenül a két tagváltozót (pedig mennyi erőt beleöltünk, hogy kétszer is elnevezzünk mindent).

    1-es rövid egyszerű, ha csak egy helyről hívod a függvényt és egyértelmű, hogy mit ad vissza akkor rendben. - Ide jól is jön a structural binding: a semmitmondó .first/.second helyett használhatunk értelmesebb elnevezéseket!
    4-es viszont szerintem a legtisztább, legexplicitebb, nincs semmi felesleges körítés benne, nem próbál több lenni annál mint ami, látszik rajta a lényeg.
    (Hívás helyén, a 4-es esetben viszont én nem használnék structural binding-ot, ha vannak tagváltozó nevek akkor használjuk, nem kell oda semmi bűvészkedés.)
    Mutasd a teljes hozzászólást!
  • Az alábbiak közül ki melyiket preferálja/találja jobban olvashatónak? (A Window osztály írójának szempontjából és a használói oldalról is)

    class Window { public: Window(std::string_view title, int width, int height) : m_title{title}, m_width{width}, m_height{height} // m_handle{glfwCreateWindow(...)}; {} std::pair<int, int> get_size_1() const noexcept { return { m_width, m_height }; } auto get_size_2() const noexcept { return std::pair{ m_width, m_height }; } auto get_size_3() const noexcept { struct { int width; int height; } result { m_width, m_height }; return result; } struct Size { int width; int height; }; Size/*auto*/ get_size_4() const noexcept { return { m_width, m_height }; /*Size{m_width, m_height}*/ } private: // GLFWwindow* m_handle; std::string m_title; int m_width; int m_height; }; int main() { Window w{"prog.hu", 1280, 720}; auto w_2 = Window{"prog.hu", 1280, 720}; const auto/*std::pair<int, int>*/ size_1 = w.get_size_1(); // size_1.first; size_1.second; const auto[width_1, height_1] = w.get_size_1(); const auto/*std::pair<int, int>*/ size_2 = w.get_size_2(); // size_2.first; size_2.second; const auto[width_2, height_2] = w.get_size_2(); const auto/* :( */ size_3 = w.get_size_3(); // size_3.width; size_3.height; const auto[width_3, height_3] = w.get_size_3(); const auto/*Window::Size*/ size_4 = w.get_size_4(); // size_4.width; size_4.height; const auto[width_4, height_4] = w.get_size_4(); }
    Mutasd a teljes hozzászólást!
Címkék
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd