J'ai une méthode qui est composée d'une logique + un appel système sous-jacent. Maintenant, une autre méthode qui contient exactement la même logique mais uniquement les changements d'appel système sous-jacents doit être implémentée. J'essaie de trouver un moyen de réutiliser le code commun et d'implémenter une autre méthode qui peut nécessiter un appel pour appeler l'appel système sous-jacent, mais qui n'a pas abouti car les appels read
et recv
sont différents.éliminer le code en double pour des définitions de fonctions similaires
Serait formidable de trouver une solution élégante à peu près la même chose. Les méthodes ressemblent -
Première fonction
std::string Socket::read(const int bufSize) const
{
auto buffer = std::make_unique<char[]>(bufSize + 1);
auto recvd = 0, count = 0;
std::string str;
str.reserve(bufSize);
do {
// ONLY THIS PART IS DIFFERENT
recvd = ::read(sockfd, buffer.get() + count, bufSize - count);
// ONLY THIS PART IS DIFFERENT
count += recvd;
if (count == bufSize) {
str.append(buffer.get());
str.reserve(str.length() + bufSize);
std::memset(buffer.get(), 0, bufSize);
count = 0;
}
} while (recvd > 0);
str.append(buffer.get(), count);
if (recvd == -1) {
// TODO: Check for recvd == EAGAIN or EWOULDBLOCK and
// don't throw exception in that case.
throw std::runtime_error("Error occurred while writing message");
}
return str;
}
deuxième fonction
std::string Socket::recv(const int bufSize, SF::recv flags) const
{
auto buffer = std::make_unique<char[]>(bufSize + 1);
auto recvd = 0, count = 0;
std::string str;
str.reserve(bufSize);
do {
// ONLY THIS PART IS DIFFERENT
const auto f = static_cast<int>(flags);
recvd = ::recv(sockfd, buffer.get() + count, bufSize - count, f);
// ONLY THIS PART IS DIFFERENT
count += recvd;
if (count == bufSize) {
str.append(buffer.get());
str.reserve(str.length() + bufSize);
std::memset(buffer.get(), 0, bufSize);
count = 0;
}
} while (recvd > 0);
str.append(buffer.get(), count);
if (recvd == -1) {
// TODO: Check for recvd == EAGAIN or EWOULDBLOCK and
// don't throw exception in that case.
throw std::runtime_error("Error occurred while writing message");
}
return str;
}
Pourriez-vous expliquer ce que le code est censé faire? Je comprends l'essentiel, mais je pense qu'il y a probablement des façons plus simples et plus rapides de mettre en œuvre les deux. – tambre
Bien que je devrais mentionner que le moyen facile serait de simplement diviser la logique de fonction en différentes fonctions. Rien de bouleversant. – tambre
@tambre lit à partir de ' socket' et retourne un' std :: string'. –