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

Lepsza wersja kodu.

Object Storage Arubacloud
0 głosów
195 wizyt
pytanie zadane 12 stycznia 2019 w C i C++ przez Huberti Gaduła (4,500 p.)

Witam, która z poniższych wersji kodu będzie Twoim zdaniem lepsza i dlaczego?

Wersja 1:

MessageSender.h

#pragma once

#include <string>

class MessageSender {
public:
	bool send(const std::string& message);

private:
	bool isAllowed(const std::string& message) const;
};

MessageSender.cpp

#include "MessageSender.h"

bool MessageSender::send(const std::string& message)
{
	if (isAllowed(message)) {
		//kod wysylania wiadomosci
		return true;
	}
	return false;
}

bool MessageSender::isAllowed(const std::string& message) const
{
	//kod sprawdzajacy, czy wiadomosc jest dozwolona
	//na przyklad czy nie jest pusta i czy nie jest wulgarna
}

Wersja 2:

MessageSender.h

#pragma once

#include <string>

class MessageSender {
public:
	bool isAllowed(const std::string& message) const;

	void send(const std::string& message);
};

MessageSender.cpp

#include "MessageSender.h"

bool MessageSender::isAllowed(const std::string& message) const
{
	//kod sprawdzajacy, czy wiadomosc jest dozwolona
	//na przyklad czy nie jest pusta i czy nie jest wulgarna
}

void MessageSender::send(const std::string& message)
{
	//kod wysylania wiadomosci
}

Podsumowywując, w wersji pierwszej użytkownik jest zabezpieczony przed popełnieniem błędu związenego z nie wywołaniem metody isAllowed. Jednak z drugiej strony może to być mylące, jeżeli użytkownik nie spojrzy na typ wartości zwracanej, to może się okazać, że uzna on wiadomość za wysłaną, kiedy wcale taką nie jest. W wersji drugiej to użytkownik jest zobowiązany do wywołania metody isAllowed przed wywołaniem metody send. Takie rozdzielenie umożliwia użytkownikowi zdecydowanie, czy chce on wysyłać również wiadomości niedozwolone.

2 odpowiedzi

+1 głos
odpowiedź 13 stycznia 2019 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 19 stycznia 2019 przez Huberti
 
Najlepsza
Moim skromnym zdaniem, lepiej tutaj wykorzystać klasę abstrakcyjną i implementować zabezpieczenia zależnie od potrzeb użytkownika. Następnie oddzielna klasa sendera pobierałaby przy wywołaniu metody wysyłającej obiekt walidatora, zaimplementowany ręcznie lub z puli gotowych (np. sprawdzający obecność wulgaryzmów itp.). Takie rozwiązanie nie zamyka użytkownika na jeden sposób weryfikacji. Bo równie dobrze może użyć pustego walidatora, który po prostu zwraca prawdę dla każdych danych.
komentarz 14 stycznia 2019 przez Huberti Gaduła (4,500 p.)
edycja 19 stycznia 2019 przez Huberti
Dziękuję za odpowiedź. Mam jeszcze jedno pytanie, czy jest sens wykorzystania klasy abstrakcyjnej już teraz, jeżeli wiem, że algorytm do walidacji najprawdopodobniej będzie stały?

Uogólniając, czy lepiej jest poczekać z decyzją o wprowadzeniu abstrakcji do momentu wystąpienia powtórzeń, czy może odrazu implementować oczywiste abstrakcje?
1
komentarz 18 stycznia 2019 przez Patrycjerz Mędrzec (192,320 p.)
Kod powinno pisać się od samego początku w uniwersalny i rozszerzalny sposób. Nie ma znaczenia, czy algorytm będzie stały, bo narzut wydajnościowy polimorfizmu jest tak mały, że praktycznie nic nie tracisz z jego użycia, a zyskujesz bardzo wiele. Twój projekt podziękuje ci za to w przyszłości (bo sam nawet nie wiesz, kiedy wpadnie ci do głowy pomysł zmiany implementacji).
0 głosów
odpowiedź 13 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)
W wąskim ujęciu, wersja 1 będzie lepsza. Równie ważkim argumentem że "może nie sprawdzić" jest "jak to nie sprawdzi... to przecież jest w jego interesie żeby wiedzieć". Rozbicie na 2 wywołania (2 przykład), zawsze silniej wiąże klasy bo i interfejs będzie bardziej złożony.

W szerszym ujęciu, zgadzam się z @Patrycerz. Istnieje ryzyko że pojawią się tam i inne algorytmy dopuszczenia do wysłania lub strategie doręczenia. Nie wiem tylko czy decydował bym się na klasę abstrakcyjną czy wystarczyło by lżejsze rozwiązanie. No ale o to nie pytałeś.
komentarz 13 stycznia 2019 przez Patrycjerz Mędrzec (192,320 p.)

Nie wiem tylko czy decydował bym się na klasę abstrakcyjną czy wystarczyło by lżejsze rozwiązanie.

Nie powinniśmy bać się używania klas abstrakcyjnych (lub ogólniej nazywając, abstrakcji). W C++ jest to dosyć wydajne rozwiązanie, a logika kodu dzięki jej wykorzystaniu staje się bardziej przejrzysta i uniwersalna. Na przykład w Javie na każdym kroku może znaleźć implementacje różnych interfejsów, nawet w prostych bibliotekach. Moim zdaniem powinniśmy wykorzystywać wszystkie idee związane z programowaniem obiektowym, bo zyskujemy dzięki temu bardzo dużo, płacąc za to cenne minimalnie większego kodu.

komentarz 13 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)
virtual/crtp/template/functional... raczej tak to rozważam... być może prosta strategia. Virtual jest piekielnie ciężki. Poza tym Java to nie C++ na szczęście co do ograniczonych wyborów.

Podobne pytania

0 głosów
1 odpowiedź 186 wizyt
pytanie zadane 22 stycznia 2019 w C i C++ przez Huberti Gaduła (4,500 p.)
0 głosów
1 odpowiedź 118 wizyt
pytanie zadane 11 kwietnia 2019 w C i C++ przez Huberti Gaduła (4,500 p.)
0 głosów
3 odpowiedzi 544 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...