基本的に大きなmain()関数で構成されるCコードを手渡しました。私は現在、メソッドをより小さな関数に展開し、コードの意図をより明確にしようとしています。でも、私はいくつかの問題を抱えています:手続き型コードのリファクタリング時のエラー処理
void main(int argc, char *argv[])
{
if(argc != 3)
{
printf("Usage: table-server <port> <n_lists>\n");
return;
}
int port = atoi(argv[1]), n_lists = atoi(argv[2]);
if(port < 1024 || port > 49151 || n_lists < 1)
{
printf("Invalid args.\n");
return;
}
signal(SIGPIPE, SIG_IGN);
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in s_addr;
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(port);
s_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd, (struct sockaddr *)&s_addr, sizeof(s_addr)) < 0)
{
printf("(bind).\n");
return;
}
if(listen(sockfd, SOMAXCONN) < 0)
{
printf("(listen).\n");
return;
}
私はこのコードの機能は4つの主要な関心事を識別することができます:引数の数を確認することは正しいです
- を。
- コマンドラインからポートを取得します。
- 呼び出し信号(SIGPIPE、SIG_IGN)。
- 実際にソケットとの接続を試みます。
これを小さな関数にリファクタリングしようとすると、問題は主にエラー処理に関係します。
int verify_number_of_args(int argc) {
if (argc != 3) {
printf("...");
return -1;
}
return 0;
}
、それが実際にその悪いわけではない。この
if (verify_number_of_args(argc) == -1) return;
ようなものになるだろう呼び出す:例えば、1のロジックを抽出しようとしているrは次のようになります。さて、ソケットのために、それは両方のsockfd
とs_addr
を返却する必要があるような方法より面倒になるだろう、プラスのステータス戻り値:一種のよう私の主な方法を維持しようとの目的に反し
int sockfd;
struct sockaddr_in* s_addr;
if (create_socket(port, &sockfd, s_addr) == -1)
return;
できるだけシンプルで明瞭です。私は、もちろん、.c
ファイルのグローバル変数に頼ることができましたが、それは考えの良いようではありません。
Cでこのようなことを一般的にどのように処理しますか?
「エラー処理」タグを追加してタイトルを編集しました。 '[error-handling] [c]'のStackOverflowを検索してください。 –
@キャットコール:ありがとう! –