Code style

2:12 AM
Từ khi học viết những dòng code đầu tiên cho đến khi chở thành một lập trình viên 7 năm kinh nghiệm ít quan tâm đến code style và conding convention. Từ khi học code java từ 2003 đến giờ java vẫn thế coding convention vẫn vậy như một lối mòn cứ thế đặt tên class, hàm và biến.
Có lẽ bạn không quan tâm mấy đến nó nếu không dùng nhiều ngôn ngữ lập trình, tôi cũng vậy. Thời gian gần đây do phải liên tục dùng chuyển đổi dùng Java, PHP và C. Tôi mới cảm nhận được sự khác biệt tạo nên phong cách của từng ngôn ngữ.
Hãy xem một lập trình viên C viết code java:

static Vector<Log> get_logs() {
        Vector<Logs> logs = new Vector<Logs>();
        Log log;
        String sender, receiver, momt;
        long timestamp;
        long my_id;
        int processed_flag = Log.MSG_STATUS.NOT_PROCESSED.ordinal();
        Timestamp first_processed;
        System.out.println(str_conn);
        Connection conn;
        boolean is_add_to_list = false;
        try {
            conn = DriverManager.getConnection(str_conn, username, password);
            Statement statement = conn.createStatement();
            ResultSet result;
            String sqlCmd = "...";
            result = statement.executeQuery(sqlCmd);
            now = new Date();
            ts_now = new Timestamp(now.getTime());
            while (result.next()) {
                my_id = result.getLong("...");
                sender = result.getString("...");
                receiver = result.getString("...");
                momt = result.getString("...");
                timestamp = result.getLong("...");
                processed_flag = result.getInt("...");
                first_processed = result.getTimestamp("...");
                is_add_to_list = false;
                if (run_a) {
                    if (getOperator(sender) == OPERATOR.A
                            || getOperator(receiver) == OPERATOR.A) {
                        is_add_to_list = true;
                    }
                }
                if (run_m) {
                    if (getOperator(sender) == OPERATOR.M
                            || getOperator(receiver) == OPERATOR.M)
                        is_add_to_list = true;
                }
                if (run_v) {
                    if (getOperator(sender) == OPERATOR.V
                            || getOperator(receiver) == OPERATOR.V)
                        is_add_to_list = true;
                }
                if (run_b) {
                    if (getOperator(sender) == OPERATOR.B
                            || getOperator(receiver) == OPERATOR.B)
                        is_add_to_list = true;
                }
                if (is_add_to_list) {
                    if (processed_flag == Log.MSG_STATUS.NOT_PROCESSED
                            .ordinal()) {
                        first_processed = ts_now;
                        lstFirstProcessed.add(my_id);
                    }
                    log = new Log(sender, receiver, timestamp, my_id,
                            processed_flag, momt, first_processed);
                    logss.add(log);
                }
            }
            result.close();
            statement.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
           return logs;
    }
Các lập trình viên C luôn luôn trí tuệ. Họ dùng quá nhiều cờ để định trạng thái hoạt động của các hàm. Nhiều lúc nhìn tróng cả mặt mà không hiểu luồng hoạt động như thế nào. Debug thật đau khổ không biết lúc nào cái cờ nó true hay false.

static void read_messages_from_bearerbox(void)
{
    time_t start, t;
    int secs;
    int total = 0;
    int ret;
    Msg *msg;

    start = t = time(NULL);
    while (program_status != shutting_down) {
        /* block infinite for reading messages */
        ret = read_from_bearerbox(&msg, INFINITE_TIME);
        if (ret == -1) {
            error(0, "Bearerbox is gone, restarting");
            program_status = shutting_down;
            restart = 1;
            break;
        } else if (ret == 1) /* timeout */
            continue;
        else if (msg == NULL) /* just to be sure, may not happens */
            break;

    if (msg_type(msg) == admin) {
        if (msg->admin.command == cmd_shutdown) {
        info(0, "Bearerbox told us to die");
        program_status = shutting_down;
        } else if (msg->admin.command == cmd_restart) {
        info(0, "Bearerbox told us to restart");
        restart = 1;
        program_status = shutting_down;
        }
        /*
         * XXXX here should be suspend/resume, add RSN
         */
        msg_destroy(msg);
    } else if (msg_type(msg) == sms) {
        if (total == 0)
        start = time(NULL);
        total++;
        gwlist_produce(smsbox_requests, msg);
    } else if (msg_type(msg) == ack) {
        if (!immediate_sendsms_reply)
        delayed_http_reply(msg);
        msg_destroy(msg);
    } else {
        warning(0, "Received other message than sms/admin, ignoring!");
        msg_destroy(msg);
    }
    }
    secs = difftime(time(NULL), start);
    info(0, "Received (and handled?) %d requests in %d seconds "
         "(%.2f per second)", total, secs, (float)total / secs);
}
Bạn ngĩ thế nào khi đọc cái phương thức này trong một file có khoảng 3600 dòng code.

0 comments:

Post a Comment