W C ++ funkcje takie jak wyjątki wpływają na cały program: możesz je wyłączyć w całym programie lub musisz postępować z nimi w całym kodzie. W słynnym artykule na temat C ++ Report :
Wbrew intuicji, trudną częścią kodowania wyjątków nie są jawne rzucanie i łapanie. Naprawdę trudną częścią korzystania z wyjątków jest napisanie całego interweniującego kodu w taki sposób, aby arbitralny wyjątek mógł rozprzestrzenić się z jego strony rzutowania do jego programu obsługi, docierając bezpiecznie i bez uszkadzania innych części programu po drodze.
Ponieważ nawet new
generuje wyjątki, każda funkcja musi zapewniać podstawowe bezpieczeństwo wyjątków - chyba że wywołuje tylko funkcje, które gwarantują brak wyjątku - chyba że całkowicie wyłączysz wyjątki w całym projekcie .
Dlatego wyjątki są funkcją „całego programu” lub „całego zespołu”, ponieważ muszą być zrozumiałe dla każdego w zespole, który ich używa. Ale o ile wiem, nie wszystkie funkcje C ++ są takie.
Możliwym przykładem jest to, że jeśli nie otrzymam szablonów, ale ich nie użyję, nadal będę w stanie napisać poprawne C ++ - czy nie? Mogę nawet przywołać sort
szereg liczb całkowitych i cieszyć się niesamowitą przewagą prędkości wrt. C qsort
(ponieważ nie jest wywoływany wskaźnik funkcji), bez ryzyka błędów - czy nie? Wygląda na to, że szablony nie są „całym zespołem”.
Czy istnieją inne funkcje C ++, które wpływają na kod, który ich nie używa bezpośrednio, a zatem są „całymi zespołami”? Szczególnie interesują mnie funkcje nieobecne w C.
Aktualizacja : szczególnie szukam funkcji, w których nie ma znaków wymuszonych językowo, o których musisz wiedzieć. Pierwszą odpowiedź, o której wspomniałem, jest ciągła poprawność, która obejmuje również cały zespół, dlatego wszyscy muszą się o tym dowiedzieć; jednak AFAICS wpłynie na ciebie tylko wtedy, gdy wywołasz funkcję, która jest oznaczona const
, a kompilator uniemożliwi ci wywoływanie jej na obiektach innych niż const, więc masz coś do znalezienia w Google. Z wyjątkami nawet tego nie rozumiesz; co więcej, są one zawsze używane, gdy tylko z nich skorzystasz new
, stąd wyjątki są bardziej „podstępne”. Ponieważ nie mogę tego sformułować jako obiektywnego, docenię każdą funkcję całego zespołu.
Aktualizacja 2 : zamiast funkcji C ++ powinienem napisać coś takiego jak „funkcja specyficzna dla C ++”, aby wykluczyć takie rzeczy, jak wielowątkowość, która dotyczy dużej liczby głównych języków programowania.
Dodatek: Dlaczego to pytanie jest obiektywne (jeśli się zastanawiasz)
C ++ jest złożonym językiem, więc wiele projektów lub przewodników kodowania próbuje wybrać „proste” funkcje C ++, a wiele osób próbuje włączyć lub wykluczyć niektóre z nich w oparciu o głównie subiektywne kryteria. Pytania na ten temat są prawidłowo zamykane tutaj, na SO.
Powyżej natomiast zdefiniowałem (tak dokładnie, jak to możliwe), czym jest funkcja językowa „całego zespołu”, podaję przykład (wyjątki) wraz z obszernymi dowodami w literaturze na temat C ++ i proszę o funkcje całego zespołu w C ++ poza wyjątkami.
To, czy powinieneś użyć funkcji „całego zespołu”, czy też jest to istotna koncepcja, może być subiektywne - ale to oznacza, że jak zawsze znaczenie tego pytania jest subiektywne.
źródło
Oczywistą odpowiedzią jest
const
poprawność: ponieważconst
/volatile
kwalifikacja jest zaraźliwa, gdy tylko jedna część kodu zacznie go używać, każdy (bezpośrednio lub pośrednio) kod wywołujący musi być równieżconst
poprawny lubconst
jawnie odrzucać.Tak jak w przypadku wyjątków, jest to oczywiście dobra rzecz . A nawet bardziej, ponieważ w odróżnieniu od bezpieczeństwa wyjątkowego jest on ściśle weryfikowany przez kompilator.
źródło
const
-prawidłowość jest przezroczysta: dotyczy tylko typu , który nadajesz funkcji (która jest zawsze widoczna), a kompilator będzie krzyczeć na ciebie, jeśli się pomylisz. Myślałem o bardziej nieprzejrzystych rzeczach, w których nie masz pojęcia, że coś jest nie tak, dopóki nie będzie za późno (i nawet wtedy trudno będzie to rozgryźć). Ale i tak twoja odpowiedź jest interesująca, dlatego została pozytywnie oceniona.Wskaźniki
źródło
Inną możliwością jest przeciążenie operatora. Raz jedna część kodzie zaczyna majstrować przy przeciążone operatory każdy ma tendencję, aby rozpocząć drugi zgadywania tylko co dokładnie dany obiekt pracują ze jest faktycznie robi. Nie propaguje jawnie przez bazę kodu w sposób, w jaki robią to wyjątki i stała poprawność, ale z pewnością jest to coś, co może zacząć powodować problemy, jeśli cały zespół nie ma na tej samej stronie, kiedy, jak i dlaczego z niego korzystać.
źródło
Jedyną poza stałą poprawnością (patrz wyżej), która przychodzi na myśl, jest stan strumieniowania. Jeśli napiszesz kod C ++, w którym korzystasz z obiektów i podobiektów oraz istnieje hierarchia obiektów, ostatecznie będziesz chciał wysłać lub odebrać dane do / od operatora programu. Państwo może napisać proste operacje strumieniowe że będzie skompilować i będzie być semantycznie poprawne ...
... Ale kiedy to zrobisz, nigdy nie będziesz mieć żadnej gwarancji, że to, co próbujesz napisać (lub, co najważniejsze, przeczytać), ma ten sam format, co klient wysyła. W przypadku strumieni dzieje się zbyt wiele dziwnych przypadków, a nawet gorzej, jeśli musisz przekazywać strumienie lub flagi strumieni jako argumenty w łańcuchu wywołań funkcji… tak jak zwykle przesyłane jest strumieniowanie klas. Tak więc streaming można zdefiniować jako „podstępny”, jak używałeś powyższego terminu, a może nawet jako „wirusowy” ( choć nie w żadnym stopniu w takim samym stopniu, jak stałą poprawności ).
Czy członek głęboko w twojej hierarchii klasowej jest
string
? Niespodzianka, klient lepiej wysyła jedno słowo, bo inaczej. Masz jakieś liczby, które chcesz serializować? Lepiej sprawdzaj, zapisuj i przywracaj flagi strumieniowe na każdej głębokości wywołania funkcji, ponieważ nigdy nie wiesz, kto jest idiotą, który ustawił swój strumień na ósemkowe wyjście przed wywołaniem twojej funkcji. Albo gorzej - kto właśnie nazwał coś podobnego,setfill
asetw
tym samym złamał formatowanie wejścia / wyjścia twojego pierwszego - i tylko pierwszego - integralnego elementu, ponieważ te stany nie propagują się . No i nie pytajmy o strumienie i internacjonalizację.W języku nie ma ostrzeżenia, że przesyłasz strumieniowo w prawidłowy lub niewłaściwy sposób, a nawet w ogóle . Pytanie o kod klienta, który należy przekazać do zapisu kopii zapasowej danych? Tak naprawdę nie masz sposobu, aby wiedzieć, że strumień wskazuje
/dev/null
. ( Z drugiej strony możesz w ten sposób uzyskać niesamowite prędkości tworzenia kopii zapasowych i współczynniki kompresji! )źródło