• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czysty kod funkcji C++

Object Storage Arubacloud
0 głosów
236 wizyt
pytanie zadane 6 grudnia 2022 w C i C++ przez MaDo Nowicjusz (120 p.)
Cześć. Kiedyś ktoś gdy uczył mnie programować w C++ powiedział, że złą praktyką jest używanie komendy cout i cin w funkcji int. Czy to prawda?

3 odpowiedzi

+2 głosów
odpowiedź 7 grudnia 2022 przez Oscar Nałogowiec (29,290 p.)
edycja 7 grudnia 2022 przez Oscar

Tak w skrócie: istnieje pojęcie funkcji "czystej". To taka funkcja która operuje tylko na swoich parametrach i na zmiennych lokalnych. Tak napisana funkcja zwykle nie ma problemów z używaniem jej w rekurencji i współbieżności. cout i cin to są zmienne globalne (nie są to komendy). Nie ma to co wiele wspólnego ze zwracanym typem, jednak sam fakt zwracania czegoś (oprócz void) sugeruje, że chodzi o funkcje których rezultatem to zwracany wynik, a nie tzw skutki uboczne. Oczywiście wynik można też dostarczyć "na zewnątrz" innymi sposobami. Wiele instrukcji w C ma swoje skutki uboczne, np. operator przypisanie zwaraca wartość prawego argumentu i tyle, jego skutkiem ubocznym jest przypisanie wartości do zmiennej. A operator + to taki przykład funkcji czystej.

EDIT: drobne literówki

+1 głos
odpowiedź 7 grudnia 2022 przez Great Stary wyjadacz (12,300 p.)

Dobrą praktyką jest tworzenie funkcji:

  • krótkich
  • z minimalną liczbą parametrów
  • wykonujących jedno zadanie

Przykład funkcji, która powinna zostać podzielona z powodu zbyt wielu wykonywanych zadań:

int suma_najmniejszych_pieciu_elementow_tablicy_wczytana_z_wejscia_z_ekstremalnie_dluga_nazwa() {
    std::vector<int> ints(10);
    for (int& i : ints) {
        std::cin >> i;
    }

    std::partial_sort(ints.begin(), ints.begin() + 5, ints.end());
    std::cout << "Najmniejsze: ";
    for (auto it = ints.begin(); it != ints.begin() + 5; ++it) {
        std::cout << *it << " ";
    }

    int sum{};
    for (int i = 0; i < 5; ++i) {
        sum += ints[i];
    }

    return sum;
}
  • wczytuje dane
  • wyszukuje poprzez sortowanie 5 najmniejszych liczb 
  • wypisuje 5 najmniejszych liczb 
  • zwraca sumę 5 najmniejszych liczb 

Przykład poprawnie napisanej funkcji z std::cout, std::cin i zwracającej inta:

#include <iostream>     
#include <string>       

int readint(std::string msg = "") {
    int num;
    std::cout << msg;
    std::cin >> num;
    return num;
}

int main() {
    int myInt = readint("Podaj liczbę: ");
}
0 głosów
odpowiedź 7 grudnia 2022 przez techno16 Gaduła (4,780 p.)

Nigdy nie słyszałem o używaniu cin i cout w funkcji main. Może chodziło o używanie:

using namespace std; ?

Wtedy może dojść do kolizji przy większych plikach. Szczególnie kiedy zrobimy to w global scope (przed funkcjami).

https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice

komentarz 7 grudnia 2022 przez Robertosp266 Nowicjusz (240 p.)
Przerabiałem już kilka kursów i na wszystkich zalecają tą komendę, żeby nie pisać wszędzie std:: . Chętnie się dowiem o co tu chodzi.
3
komentarz 7 grudnia 2022 przez j23 Mędrzec (194,920 p.)

Takie "otwieranie" przestrzeni nazw samo w sobie nie jest czymś złym, tylko trzeba mieć świadomość tego, co się robi.

Jak otworzysz przestrzeń w pliku źródłowym (.cpp), to nic wielkiego się nie stanie, bo to otwarcie ograniczone jest tylko do tego pliku. W przypadku nagłówków sprawa wygląda inaczej, bo nagłówki załączane są/mogą być w wielu miejscach, gdzie nie zawsze chcemy, by jakaś przestrzeń nazw była wymieszana z inną, to może powodować konflikty.

Dodam, że using namespace można używać lokalnie wewnątrz funkcji.

 

Podobne pytania

+1 głos
2 odpowiedzi 325 wizyt
0 głosów
4 odpowiedzi 372 wizyt
pytanie zadane 6 grudnia 2015 w C i C++ przez tetriss Obywatel (1,710 p.)
0 głosów
3 odpowiedzi 729 wizyt
pytanie zadane 4 lutego 2019 w PHP przez `Krzychuu Stary wyjadacz (13,940 p.)

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...