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

Dziedziczenie publiczne czy zawieranie?

Object Storage Arubacloud
+4 głosów
173 wizyt
pytanie zadane 27 grudnia 2018 w C i C++ przez Huberti Gaduła (4,500 p.)

Załóżmy, że Napisałeś aplikację, która jest dostępna w dwóch językach: polskim i angielskim. Język w Twojej aplikacji ustawiany jest na podstawie języka w systemie operacyjnym. Jeżeli system operacyjny korzysta z języka polskiego, to podczas startu aplikacji ładujesz tłumaczenie na polski, w przeciwnym wypadku ładujesz angielski.

Przykład kodu nieobiektowego z wykorzystaniem frameworka Qt (nie trzeba znać frameworka, aby wywnioskować, co robi kod).

Main.cpp

#include <qcoreapplication.h>
#include <qtranslator.h>
#include <qlocale.h>

void loadLanguageSameAsLanguageOfOperatingSystem(QTranslator& translator);

QLocale::Language getLanguageOfOperatingSystem();

int main(int argc, char* argv[])
{
	QCoreApplication application(argc, argv);

	QTranslator translator;
	loadLanguageSameAsLanguageOfOperatingSystem(translator);
	application.installTranslator(&translator);

	return application.exec();
}

void loadLanguageSameAsLanguageOfOperatingSystem(QTranslator& translator)
{
	const QString pathInOperatingSystemToFolderWithTranslations = "translations";
	switch (getLanguageOfOperatingSystem()) {
	case QLocale::Polish:
		translator.load("Polish", pathInOperatingSystemToFolderWithTranslations);
		break;
	default:
		translator.load("English", pathInOperatingSystemToFolderWithTranslations);
		break;
	}
}

QLocale::Language getLanguageOfOperatingSystem()
{
	const QLocale locale;
	return locale.language();
}

Teraz chcąć to przepisać na kod obiektowy są dwie możliwości:

  1. Skorzystać z dziedziczenia publicznego, czyli relacji jest-czymś.
  2. Skorzystać z zawierania, czyli relacji ma-coś.

Pytanie: Która z powyższych opcji będzie najlepsza i dlaczego?

PS W komentarzu są te dwie opcje w kodzie.

komentarz 27 grudnia 2018 przez Huberti Gaduła (4,500 p.)
edycja 27 grudnia 2018 przez Huberti

Wersja z dziedziczeniem publicznym:

Translator.h

#pragma once

#include <qtranslator.h>
#include <qcoreapplication.h>
#include <qlocale.h>

class Translator : public QTranslator {
public:
	void setLanguageSameAsLanguageOfOperatingSystem(QCoreApplication& application);

private:
	QLocale::Language getLanguageOfOperatingSystem() const;
};

Translator.cpp

#include "Translator.h"

void Translator::setLanguageSameAsLanguageOfOperatingSystem(QCoreApplication& application)
{
	const QString pathInOperatingSystemToFolderWithTranslations = "translations";
	switch (getLanguageOfOperatingSystem()) {
	case QLocale::Polish:
		load("Polish.qm", pathInOperatingSystemToFolderWithTranslations);
		break;
	default:
		load("English.qm", pathInOperatingSystemToFolderWithTranslations);
		break;
	}
    application.installTranslator(this);
}

QLocale::Language Translator::getLanguageOfOperatingSystem() const
{
	const QLocale locale;
	return locale.language();
}

Main.cpp

#include <qcoreapplication.h>
#include "Translator.h"

int main(int argc, char* argv[])
{
	QCoreApplication application(argc, argv);

	Translator translator;
	translator.setLanguageSameAsLanguageOfOperatingSystem(application);

	return application.exec();
}

Wersja z zawieraniem:

Translator.h

#pragma once

#include <qtranslator.h>
#include <qcoreapplication.h>
#include <qlocale.h>

class Translator {
public:
	void setLanguageSameAsLanguageOfOperatingSystem(QCoreApplication& application);

private:
	QLocale::Language getLanguageOfOperatingSystem() const;

	QTranslator translator;
};

Translator.cpp

#include "Translator.h"

void Translator::setLanguageSameAsLanguageOfOperatingSystem(QCoreApplication& application)
{
	const QString pathInOperatingSystemToFolderWithTranslations = "translations";
	switch (getLanguageOfOperatingSystem()) {
	case QLocale::Polish:
		translator.load("Polish.qm", pathInOperatingSystemToFolderWithTranslations);
		break;
	default:
		translator.load("English.qm", pathInOperatingSystemToFolderWithTranslations);
		break;
	}
    application.installTranslator(&translator);
}

QLocale::Language Translator::getLanguageOfOperatingSystem() const
{
	const QLocale locale;
	return locale.language();
}

Main.cpp

#include <qcoreapplication.h>
#include "Translator.h"

int main(int argc, char* argv[])
{
	QCoreApplication application(argc, argv);

	Translator translator;
	translator.setLanguageSameAsLanguageOfOperatingSystem(application);

	return application.exec();
}

 

komentarz 27 grudnia 2018 przez j23 Mędrzec (194,920 p.)
Nie przesadzasz z długościami nazw?

2 odpowiedzi

+1 głos
odpowiedź 27 grudnia 2018 przez RafalS VIP (122,820 p.)
wybrane 12 stycznia 2019 przez Huberti
 
Najlepsza

Nie podoba mi się modyfikowanie przekazanego argumentu, bo to jest takie... proceduralne :P Klasa modyfikuje swoje pola a nie argumenty metod.

Jestem zdania, że nie należy opakowywać funkcjonalności ustawienia jezyka jako całości w jedną klase tylko wyodrębnić czego nam brakuje i napisać klasa dla tej brakującej funkcjonalności. Bez dublowania tego co już udostępnia QTranslator i QLocale.

Tak na prawdę brakuje mapowania QLanguage na nazwe pliku.

Można pomyśleć nad klasą propertisową, która zwróci ścieżke pliku z tlumaczeniem danego języka.

Ale można też generować nazwy dynamicznie. Zauważ, że jest metoda:

QString QLocale::languageToString(QLocale::Language language)

dzięki, której zamiast tego szpetnego switch case'a można napisać:

	if (!this->translator.load(languageToFileName(locale.language())))
		this->translator.load(languageToFileName(QLanguage::English));
	app.installTranslator(&this->translator);

Pytanie gdzie umieścić languageToFileName:

QString languageToFileName(QLanguage lang) {
	return QLocale::languageToString(lang) + ".qm";
}

W ostatecznosci jako prywatna metoda aplikacji, ale lepiej w jakiejś klasie propertisowej razem ze sciezkami do innych rzeczy.

pathInOperatingSystemToFolderWithTranslations 

Plus za deskryptywne nazwy, ale z tak długą nazwą nie da się pracować. Wyobraź sobie, że potrzebujesz napisać tą nazwe 2 czy nawet 3 razy w jednej linijce. "translationsDirPath" mówi tyle samo.

 

0 głosów
odpowiedź 27 grudnia 2018 przez mokrowski Mędrzec (155,460 p.)
Może będziesz zdziwiony ale jedna z możliwych odpowiedzi to ta: żaden z powyższych. Tłumaczenie to wymaganie aspektowe które nadaje się do ew. implementacji  przez politykę. To jest ta sama kategoria wymagań jaka obowiązuje dla wymagań "szerokiego bezpieczeństwa" czy logowania zdarzeń. Są takie wymagania które "kroją aplikację po całości".

Oczywiście jeśli nie masz wyboru lub aplikacja jest mała i nie ma wydzielonej warstwy gdzie możesz sensownie to zaimplementować, zawieranie będzie lepsze bo łatwiejsze do potencjalnej zmiany i rozwijania aplikacji.

Podobne pytania

0 głosów
2 odpowiedzi 554 wizyt
pytanie zadane 9 września 2017 w C i C++ przez B0nkers Początkujący (310 p.)
+1 głos
1 odpowiedź 3,480 wizyt
0 głosów
1 odpowiedź 117 wizyt
pytanie zadane 21 maja 2020 w SQL, bazy danych przez Bizuma Gaduła (3,650 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

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

...