Cześć!
Aktualnie piszę program generujący dane do bazy danych i natrafiłem na problem, którego sam nie rozwiążę, ponieważ nie mam dostatecznego doświadczenia.
Otóż zastanawiam się, co w programowaniu jest lepsze, a raczej w jakich sytuacjach używać określonych typów funkcji. Mam funkcję, która wygląda tak
// funkcja nr 1
void getNameAndSurname(QFile& nameFile, QFile& surnameFile, QString& name, QString& surname)
{
// get random numbers for name and surname
int name_num = QRandomGenerator::global() -> bounded(1, getFileRowNum(nameFile));
int sur_num = QRandomGenerator::global() -> bounded(1, getFileRowNum(surnameFile));
// open files and check
if (nameFile.open(QIODevice::ReadOnly | QIODevice::Text) && surnameFile.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream inName(&nameFile);
QTextStream inSurname(&surnameFile);
// go to choosen line
for (int i = 1; i < name_num; i++)
{
inName.readLine();
}
name = inName.readLine();
// go to choosen line
for (int i = 1; i < sur_num; i++)
{
inSurname.readLine();
}
surname = inSurname.readLine();
// close files
nameFile.close();
surnameFile.close();
}
}
Przekazujemy przez referencję dwa pliki z danymi (z imionami i nazwiskami) oraz przez referencję przekazujemy zmienne, w których wyląduje jakieś imię i nazwisko wybrane z pliku.
Złapałem się jednak na tym, że masa podobnych funkcji wprowadza nieład, to jest używanie samych void'ów sprawi, że niekiedy nie wiadomo, co ta funkcja tak w zasadzie robi, co modyfikuje.
Wobec tego chciałem rozbić tę funkcję na dwie:
// funkcja nr 2.1
QString getName(bool gender)
{
QFile name_file;
if (gender)
{
name_file.setFileName("D:\\Qt\\Dane\\dane\\PersonalData\\name_man");
}
else
{
name_file.setFileName("D:\\Qt\\Dane\\dane\\PersonalData\\name_woman");
}
int name_num = QRandomGenerator::global() -> bounded(1, getFileRowNum(name_file));
if (name_file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream in(&name_file);
for (int i = 1; i < name_num; i++)
{
in.readLine();
}
return in.readLine();
}
else
return 0;
}
oraz
// funkcja nr 2.2
QString getSurname(bool gender)
{
QFile name_file;
if (gender)
{
name_file.setFileName("D:\\Qt\\Dane\\dane\\PersonalData\\surname_man");
}
else
{
name_file.setFileName("D:\\Qt\\Dane\\dane\\PersonalData\\surname_woman");
}
int name_num = QRandomGenerator::global() -> bounded(1, getFileRowNum(name_file));
if (name_file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream in(&name_file);
for (int i = 1; i < name_num; i++)
{
in.readLine();
}
return in.readLine();
}
else
return 0;
}
W nich w zależności od płci wybierany byłby inny plik i zwracalibyśmy odpowiednio imię/nazwisko. Tylko jak widzimy, kod funkcji typu void jest znacznie krótszy, ponieważ funkcje getName() oraz getSurname() są niemal identyczne, różnią się tylko nazwami plików, wobec tego mógłbym to jeszcze skrócić do:
// funkcja nr 3
QString getData(bool gender, QString path)
{
QFile file;
if (gender)
{
file.setFileName(path);
}
else
{
file.setFileName(path);
}
int name_num = QRandomGenerator::global() -> bounded(1, getFileRowNum(name_file));
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream in(&name_file);
for (int i = 1; i < name_num; i++)
{
in.readLine();
}
return in.readLine();
}
else
return 0;
}
Wtedy jednak nazwa funkcji nie mówi o tym, co ta funkcja robi, jest to raczej coś ogólnego - dane.
Tak więc moje pytanie brzmi: w jakich sytuacjach lepiej stosować funkcję nr 1, a w jakich funkcję nr 2.1 i 2.2? A może zamiast nr 2.1 i 2.2 wystarczy nr 3? W dodatku czy przekazywanie dużej ilości parametrów do funkcji jest dobrą opcją? Tutaj mam maksymalnie 4 parametry, jednakże w innej funkcji wychodzi mi ich o kilka więcej, a to już wydaje mi się za dużo.
Jak się w tym nie pogubić? Nigdy jeszcze nie widziałem dużego programu (a nawet małego), który ma sporo funkcji i w moim programie pojawił się nieład, który staram się uporządkować. Tak więc wszelkie odpowiedzi na temat używania funkcji mile widziane :)