2010-10-02 12 views
5

Czy istnieje jakaś zasada, kiedy używać dwóch funkcji lub kiedy przekazywać parametr boolowski.Dwie funkcje lub parametr boolowski?

Dzięki

+2

Co to w ogóle znaczy? Czy możesz podać przykład kodu? – NullUserException

+0

Tak, istnieje wiele reguł. Wszystkie są sprzeczne, a wszystkie z nich zależą od osobistych (lub zespołowych) preferencji. Moja osobista zasada jest prosta: jeśli czuję potrzebę dodania komentarza do metody lub wywołania metody, muszę to zmienić. – Tergiver

Odpowiedz

7

Minęło trochę czasu odkąd ostatni re-read Code Complete, ale niejasno przypominam McConnell adresowania tego, a wyrazy „dysjunktywny conherence” pop w mojej głowie. Krótko,

void f(int x, int y, bool b) 

kontra

void f1(int x, int y) 
void f2(int x, int y) 

jest często wybór, w zależności od tego, jak podobne lub różne f będzie zachowywać się pod true kontra false może sensu podzielić go na dwie funkcje i dać im różne nazwy. Często trzeci wybór jest lepszy, czyli zmiana bool na enumę dwuwartościową, gdzie nazwa wyliczeniowa daje wyraźne rozróżnienie.

Kluczem jest spojrzenie na strony z ogłoszeniami i sprawdzenie, czy znaczenie jest jasne po przeczytaniu kodu. Jeśli jesteś skłonny umieścić komentarz na każdej logicznej call-site:

f(3, 4, true /* absoluteWidgetMode */) 

i call-strony zazwyczaj zadzwonić z logicznych stałych, to silny zapach, że należy podzielić ją na kilka funkcji.

4

logiczne parametry są znaczeniawiększość czasu, w zasadzie taką samą krytykę zasługuje magiczne numery zrobienia. Nie masz szans na niezauważenie, co się dzieje po prostu patrząc na wywołanie funkcji.

Nawet jeśli wygodnie jest mieć parametr boolowski dla bardzo podobnych kodów (dodawanie/nadpisywanie pliku), zachowaj go wewnętrznie, prywatnie i nie pozwól, aby był widoczny w interfejsie.

Zamiast zawsze zmusić programatora być wyraźny:

Zastosowanie wyliczenia dać sensowne opisy rozróżnienia lub po prostu użyć oddzielne funkcje.

Porównaj:

WriteFile(path, "Hello, World", true) 

z

WriteFile(path, "Hello, World", FileMode.Append) 

lub po prostu

AppendFile(path, "Hello, World") 
+2

Należy zauważyć, że nie dotyczy to języków o nazwanych parametrach. 'WriteFile (Append: True)' jest prawdopodobnie tak samo czytelny jak 'WriteFile (Mode: FileMode.Append)'. – sepp2k

+0

@ sepp2k: To prawda, choć nie podoba mi się podejście oparte na nazwanym parametrze - mimo że jest ono pełne - ponieważ ich użycie nie jest wymuszane, a zatem nie ma znaczenia, że ​​parametry będą nadal występować (np. Z powodu lenistwa). Nazwanie argumentów kompulsywnymi poprawiłoby sytuację, ale prawdopodobnie zmniejszyło możliwości abstrakcji (funkcje wyższego rzędu, delegaci, częściowe zastosowanie, ciche programowanie). Również w tym przypadku najlepszym wyborem są silne typy lub różne funkcje. – Dario

Powiązane problemy