Podczas pisania niektórych funkcji znalazłem słowo kluczowe const w parametrach takich jak to:
void MyClass::myFunction(const MyObject& obj,const string& s1,const string& s2,const string& s3){
}
często powoduje podział linii na 2 linie w IDE lub vimie, więc chcę usunąć wszystkie słowa kluczowe const w parametrach:
void MyClass::myFunction(MyObject& obj,string& s1,string& s2,string& s3){
}
czy to ważny powód, aby nie używać const? Czy utrzymywanie obiektów parametrów pozostaje niezmienione ręcznie?
c++
coding-style
const
grgrr
źródło
źródło
const
masz silną wskazówkę, że nie musisz się martwić, jak można to zmienić w funkcji.Odpowiedzi:
Czytelność jest ważnym powodem, aby nauczyć się korzystać z białych znaków:
Umieszczone tam parametry nie będą mylone z treścią funkcji. Lokalizując je w innym wierszu, nie będziesz musiał zmieniać ich położenia, gdy zmienisz nazwę
myFunction
na coś bardziej opisowego. Nie zmienianie pozycji parametrów, gdy nie uległy zmianie, jest czymś, co docenią użytkownicy narzędzia do kontroli źródła.const
coś znaczy Nie wyrzucaj tego tylko dlatego, że brakuje Ci miejsca i pomysłów. Czytelność jest królem, ale łamanie rzeczy w imię jest po prostu rezygnacją.źródło
(
, a jeśli tak, to być może będziesz musiał zmienić położenie je, jeśli długość nazwy klasy + funkcji zmienia się o więcej niż około 4 znaki. Jeśli więc nie chcesz tego robić, dodaj stałą liczbę poziomów wcięcia, a nie liczbę zależną od długości nazwy funkcji. Poleciłbym 1 poziom, ta odpowiedź używa 6, ale każda stała liczba osiąga wyznaczony cel :-)W rzeczywistości kwestia czytelności zdecydowanie idzie w innym kierunku. Po pierwsze, możesz w prosty sposób rozwiązać swoją linię run-on, używając białych znaków . Ale usunięcie
const
nie tylko powoduje, że linia jest krótsza, ale całkowicie zmienia znaczenie programu.Herb Sutter odnosi się
const
doconst
tego, co najważniejsze,const
ponieważ odniesienie doconst
może wiązać się z chwilowym i przedłużyć jego żywotność. Odwołanie do wartości nieconst
jest niemożliwe, potrzebujesz osobnej zmiennej.Dla użyteczności oznacza to, że będziesz musiał wprowadzić wszystkie te zmienne tymczasowe, aby móc wywołać swoją funkcję. To nie jest świetne dla czytelności, ponieważ te zmienne są bez znaczenia i istnieją tylko dlatego, że twoja sygnatura jest błędna.
źródło
const
odnosi sięconst
do drugiego,const
a coconst
najważniejszeconst
const&
zamiast odwoływania sięconst
jako rzeczownik (fraza)Prosta odpowiedź brzmi „nie”.
Długa odpowiedź brzmi:
const
słowo kluczowe jest częścią umowy, którą oferuje funkcja; informuje, że argument nie zostanie zmodyfikowany. W momencie usunięciaconst
gwarancji ta znika z okna. Pamiętaj, że nie można zasadnie utrzymywać constness (lub innego mienia) coś za pomocą dokumentacji, zjazdy, lub wytyczne - jeśli constness nie jest wymuszana przez kompilator, ktoś będzie myśleć, że mogą uczynić swoją pracę łatwiej, jeśli bawić z parametr „tylko trochę”. Rozważać:Oprócz tego, że ta ostatnia wersja jest bardziej zwięzła, zapewnia również silniejszą umowę i pozwala kompilatorowi pomóc w utrzymaniu twoich intencji. Ten pierwszy nie robi nic, aby uniemożliwić
fna(Foo&)
funkcji zmodyfikowanie przekazywanego parametru.Podobnie jak w odpowiedzi @CandiedOrange, możesz użyć białych znaków, aby ułożyć kod i zwiększyć czytelność.
źródło
Usunięcie
const
słowa kluczowego usuwa czytelność, ponieważconst
przekazuje informacje do czytnika i kompilatora.Zmniejszenie długości kodu w poziomie jest dobre (nikt nie lubi przewijania w bok), ale jest coś więcej
const
niż tekst. Możesz to przepisać:Co nie zmienia umowy, ale spełnia potrzebę zmniejszenia długości linii. Naprawdę uważałbym powyższy fragment za mniej czytelny i wybrałbym użycie większej ilości białych znaków, jak już wspomniano w odpowiedzi CandiedOrange.
const
jest funkcją samego kodu. Nie spowodowałbyś, że funkcja nie byłaby członkiem w celu usunięciaMyClass::
sekcji deklaracji, więc nie usuwajconst
źródło
MObj
istr
są, a na pewno podnosi brwi. Jest to szczególnie dziwne w przypadku typów, nad którymi już masz kontrolę: np. Dlaczego nie nazwałeśMyObject
takMObj
na początek?Nie. Pominięcie
const
może zmienić funkcjonalność, utracić zabezpieczeniaconst
i może potencjalnie stworzyć mniej wydajny kod.Zamiast spędzać czas na ręcznym tworzeniu kodu
Użyj narzędzi do automatycznego formatowania . Napisz funkcję zgodnie z jej wymaganiami funkcjonalnymi i pozwól, aby automatyczne formatowanie obsłużyło prezentację. Ręczne dostosowywanie formatowania nie jest tak wydajne, jak użycie automatycznego formatowania i wykorzystanie zaoszczędzonego czasu do poprawy innych aspektów kodu.
źródło
Tak długo, jak to możliwe, lepiej zachować stałą widoczność. Znacznie poprawia to utrzymanie kodu (bez zgadywania, czy ta metoda zmienia moje argumenty).
Jeśli widzę wiele argumentów w metodzie, zmusza mnie to do rozważenia stworzenia jarona opartego na projekcie (Matrix, Pracownik, Prostokąt, Konto), który byłby znacznie krótszy, łatwiejszy do zrozumienia (eliminuje długą listę argumentów do metod).
źródło
typedef Point * LPPOINT
Itypedef const Point * LPCPOINT
chociaż bardzo wstrętne, nadal ma ukryte znaczenie, ponieważ jest zgodne z bezpośrednimi oczekiwaniami w kontekście. Ale nigdy w ogólnym przypadku; to tylko dziwny wyjątek, o którym mogę myśleć.