30/09/2018, 17:52

Đọc mã nguồn Notepad ++ mà không hiểu gì cả, Có phải mình quá dốt?

Mình đang viết một chương trình Notepad++ tự chế. Nhưng khi đọc mã nguồn của Notepad ++ thì không hiểu gì cả? Có phải mình quá dốt?

vũ xuân quân viết 20:01 ngày 30/09/2018

Trình độ của em chưa tới thôi. Chịu khó đọc thêm sách chuyên sâu vào. Và làm những ví dụ liên quan.

Mai Anh Dũng viết 19:53 ngày 30/09/2018

Không, không hề dốt tí nào.

Không phải là code của Notepad++ khó, mà chỉ có điều là nó nhiều khái niệm, thiết kế mới mà mình chưa nắm. Đạt chưa đọc code Notepad++, nhưng Đạt cũng nghĩ là Đạt cũng sẽ không hiểu gì cả.

Cho tới khi mình bắt tay vào sửa code, fix bug, thêm feature, thì mình mới có thể hiểu được code của một chương trình. Đặc biệt là các chương trình lớn như Notepad++.

hacked viết 20:01 ngày 30/09/2018

Em thấy Notepad ++ có hơn 100 file, mỗi file đó cũng rất dài, mà chẳng hiểu được đâu là khai báo biến, khai báo hàm, có nhiều chổ mà mình chả hiểu gì cà:
Đây là ví dụ:

void FileDialog::setExtFilter(const TCHAR *extText, const TCHAR *ext, ...)
{
    // fill out the ext array for save as file dialog
	generic_string exts;

    va_list pArg;
    va_start(pArg, ext);

    const TCHAR *ext2Concat;
	ext2Concat = ext;
    do
	{
        if (ext2Concat[0] == TEXT('.'))
            exts += TEXT("*");
        exts += ext2Concat;
        exts += TEXT(";");
	}
	while ( (ext2Concat = va_arg(pArg, const TCHAR *)) != NULL );

	va_end(pArg);

	// remove the last ';'
    exts = exts.substr(0, exts.length()-1);

	setExtsFilter(extText, exts.c_str());
}

int FileDialog::setExtsFilter(const TCHAR *extText, const TCHAR *exts)
{
    // fill out the ext array for save as file dialog
    generic_string extFilter = extText;
	TCHAR *oldFilter = NULL;

    extFilter += TEXT(" (");
    extFilter += exts;
	extFilter += TEXT(")");	
	
	// Resize filter buffer
	int nbCharAdditional = extFilter.length() + lstrlen(exts) + 3; // 3 additional for nulls
	if (_fileExt)
	{
		oldFilter = new TCHAR[_nbCharFileExt];
		memcpy(oldFilter, _fileExt, _nbCharFileExt * sizeof(TCHAR));

		delete[] _fileExt;
		_fileExt = NULL;
	}

	int nbCharNewFileExt = _nbCharFileExt + nbCharAdditional;
	_fileExt = new TCHAR[nbCharNewFileExt];
	memset(_fileExt, 0, nbCharNewFileExt * sizeof(TCHAR));

	// Restore previous filters
	if (oldFilter)
	{		
		memcpy(_fileExt, oldFilter, _nbCharFileExt * sizeof(TCHAR));
		delete[] oldFilter;
		oldFilter = NULL;
	}
Mai Anh Dũng viết 20:04 ngày 30/09/2018

Vì Notepad++ là một project lớn, không phải lớn lắm nhưng khá lớn, nên sẽ có nhiều file. Không thể đọc một project lớn bằng cách xem từng file được. Mình phải đọc code theo dạng tìm hiểu tính năng. Một tính năng có thể nằm trong 1 hoặc nhiều file.

Tìm hiểu một tính năng cụ thể, và nhỏ, trước khi đọc toàn bộ source code. Nếu không mình sẽ bị lạc trong một mớ hỗn độn không đường ra.

vũ xuân quân viết 20:04 ngày 30/09/2018

em muốn hiểu được code của người khác viết thì phải biết cách debug(biết cách chạy chương trình).
Đọc chay như vậy thì cũng chả hiểu đâu.
Vì một hàm có thể được gọi từ hàm khác. Mà hàm đó như thế nào, em không biết thì không thể hiểu được.
Một cách khác để hiểu code của người khác viết là đọc tài liệu của dự án đó.

Võ Hoài Nam viết 19:55 ngày 30/09/2018

Bạn có thể sử dung Java Swing hoặc là Windows Form của C# để làm một cái Notepad cho đơn giản… Sau đó định hình từ từ rồi hãy chuyển qua C/C++…

viết 19:56 ngày 30/09/2018

hãy bắt đầu bằng những cái đơn giản nhất, đầu tiên phải tìm được ra hàm main của nó, từ main nó chạy ra đâu, phân nhánh đến những chỗ nào mới dò được.
Theo anh em không nên clone notepad++, clone được cái gì như notepad thôi đã, nó đơn giản hơn nhưng cũng không phải dạng vừa đâu.

Điệp viết 20:03 ngày 30/09/2018

Anh mà dốt thì chắc em là cục… :’(

Tuyendothanh viết 19:59 ngày 30/09/2018

Mình đã từng đọc qua source code của Notepad++ rồi nhưng không phải đọc tất cả. Mình học từ mã nguồn này cách tạo cửa sổ main vì dùng win32 api nên phải tạo bằng lệnh, cách chuyển đổi string multi char đến wide char và ngược lại, đặc biệt cách cài đặt plugin để mở rộng đặc tính dễ dàng, …

Nguyễn Hữu Quyền viết 20:09 ngày 30/09/2018

Cũng rất khó để đọc được Code nguồn của một phần mền không do mình viết ra nếu mình không nắm được sơ đồ mô tả của nó.
Thông thường khi làm một dự án lớn mình thường nhận các bản kế hoạch, sơ đồ , cơ sở dữ liệu , các hình vẽ được chú thích cụ thể , Các bảng
trong database thậm chí còn được viết mô tả rất chi tiết , Quy tắt đặt tên được thống nhất cụ thể . Và một điều quan trọng nhất là lập trình viên ấy muốn code của mình được mọi người đọc được thì mọi người mới đọc được đó là khái Niệm Clean Code. Hiện nay trong ngôn ngữ Java được thiết kế để viết Clean Code rất tuyệt, Code của bạn có thể tách vụn ra và ghép lại rất tường minh , thậm chí bạn có thể thay đổi cách Code vận hành mà không hề hay thay đổi gì Code đã viết trước đây.

Và nếu bạn đang làm một điều rất tốt đó là đọc các dự án nguồn mở , mình cũng rất thích được, vì như vậy sẽ lên tay rất nhanh. Mình thường hay
lên GitHub để lấy các dự án về tìm hiểu. Bạn nên chọn những dự án mà bạn quan tâm, hay bạn có thể hình dung cách mà nó hoạt động qua tên của nó thì bạn mới bắt đầu đọc hiểu dần được.

Và cuối cùng , nếu bạn theo Java thì những mà nguồn mở tốt nhất, dễ tiếp cận nhất đó chính là mã của Java , khi làm bạn hãy mở Code nguồn của Java ra đọc sẽ lên tay rất nhanh , vì họ viết mục đích cho cộng đồng mà .

Chúc bạn học tốt nhé, không lại nói mình nữa hỳ :3

Bài liên quan
0