tkomatsu/webserv

Why SetSocket() is virtual function?

Closed this issue · 2 comments

SetSocket()は仮想関数ではなく、ClientとServerクラスそれぞれで定義する通常の関数で良いのでは?
使われ方を見ると、それぞれのクラスで宣言された変数で呼び出されています。
仮想関数を使う理由は親クラスであるSocketクラスのメソッドとして呼びたいが、処理を継承クラスで分けたいからだと思いますが、現状はそれぞれのインスタンスに対してメソッドを呼び出しているので仮想関数にする理由がわかりません。
通常の関数にすることでServerでは引数を取らなくて良くなるので、今無駄にvoidにキャストしてる処理もなくなりスッキリすると思います。

Serverにおける呼ばれ方

webserv/srcs/WebServ.cpp

Lines 28 to 39 in a5c6080

void WebServ::ParseConig(const std::string &path) {
// TODO: parse config fully
(void)path;
// コンフィグをパースした結果分かる、最初に立てるべきサーバーたちをつくる
for (int i = 0; i < 3; ++i) {
Server *server = new Server(4200 + i, "127.0.0.1");
long fd = server->SetSocket(42); // 42 is meanless
sockets_[fd] = server;
}
}

Clientにおける呼ばれ方

webserv/srcs/WebServ.cpp

Lines 41 to 56 in a5c6080

int WebServ::AcceptSession(socket_iter it) {
int accepted = -1;
int server_fd = it->first;
if (FD_ISSET(server_fd, &rfd_set_)) {
Client *client = new Client();
int client_fd = client->SetSocket(server_fd);
if (client_fd > max_fd_) max_fd_ = client_fd;
sockets_[client_fd] = client;
accepted = 1;
}
return accepted;
}

リファクタリングしつつ直します。

整理していくと、Socketクラスはやはりインターフェースとしても良いのでは?と思ってきました。
整理したものをプルリクに投げるので、コードを見て判断してください。