Lập trình chỉ là if else thôi ạ?

Stages of Competence? :smiley:

Trong thực tế thì sự tiến triển như một vòng xoắn ốc vậy, chứ không thẳng lên một đường.

2 Likes

Đúng là lập trình mà dùng if else nhiều không tốt cho việc đọc code, tách logic,…

Những lập trình viên nhiều kinh nghiệm thì họ không sử dụng nhiều if else mà họ tách ra thành những hàm, class, file riêng làm mỗi một logic nhất định, được tổ chức bằng các mô hình lập trình (Software design pattern), các ví dụ thông dụng nhất là mô hình MVC, Reactive Programming, Dependency Injection, Lazy loading, Active Record, Mixin,…

Nếu em được đọc code của những senior, em thậm chí còn khó có thể thấy một câu if else nào trong code của họ. Và em sẽ không hiểu gì nếu không biết pattern đằng sau là gì.

Nếu em đã học xong cơ bản thì nên tiếp tục học những mô hình lập trình để thấy sự ảo diệu của lập trình. Những mô hình này em có thể tìm thấy trong những frameworks, libraries, open-source projects,…

2 Likes

Anh ơi anh có thể cho em xin 1 vài project nào đơn giản để em tham khảo thử với ạ

Chú muốn đơn giản kiểu như thế nào. 1 trang web hay 1 phần mềm :sunglasses:

1 Like

Câu hỏi của bạn này mình thấy rất hay mà nhưng chỉ là mang ý coi thường lập trình.Ví dụ như design patterns chính là để giảm bớt if else đó.

Thứ khiến cho lập trình có logic là các câu lệnh rẽ nhánh, vòng lặp. Không có nó xem như language đó bỏ đi
Tuy nhiên lập trình chỉ có if, else, for, switch thì không thể triển khai các bài toán khó được, kể cả quản lý nhà trường (không phải mấy cái quản lý điểm thôi, quản lý cả trang thiết bị, tài chính, thống kê số liệu,…) . Nên người ta đẻ ra lập trình hướng đối tượng để thiết kế chương trình đơn giản hơn, sát thực tế nhất. Rồi design pattern, nói gần hơn tí. Programming language còn có nhiều feature nhỏ như lamdba expression, regular expression, string pattern, các API từ thao tác dữ liệu, file, mạng,… Giúp thao tác với code đơn giản
Nói chung phần mềm không chỉ có if else for switch. Chỉ có người viết ra nó muốn source code trở thành bãi rác cho người sau maintain :laughing:

7 Likes

Mà học lập trình 1 năm chỉ có quanh quẩn if else for switch thì nên xem lại bản thân

6 Likes

Bạn học một năm mà được như thế thì chứng tỏ bạn kém chứ không phải là cái lập trình “kém”. Bạn nên suy nghĩ kĩ lại bản thân trước khi viết topic. Bạn cố học tiếp sẽ thấy những lý thuyết như:

  • Design pattern
  • SOLID
  • OOP
  • Callback
    Ngoài ra còn nhiều thứ hay ho khác.

Nếu có thời gian vọc mấy cái mình kể nha :slightly_smiling_face:. Rồi thử xem lập trình còn “tầm thường” hay không

2 Likes

Lập trình không chỉ có if else, 1 chương trình là các lệnh tuần tự + các lệnh nhảy, chưa kể nếu đi sâu vào hoạt động cpu thì nó không chỉ có thế, còn ngắt, system call các kiểu.
Và còn có phương pháp luận để viết code, phương pháp luận là gì thì Ara đã ghi ở trên :smiley:

4 Likes

Câu hỏi này nghe cách hỏi có vẻ hơi coi thường nhưng mình lại thấy đây là 1 câu hỏi rất hợp lý của những bạn đang dần dần học qua những cái cơ bản.Thắc mắc này là hoàn toàn hợp lý

Ai học lập trình mà chẳng trải qua giai đoạn đầu tiên ấy đâu. Ngày mới học mình cũng rất hay hỏi ở những diễn đàn việt nam. Rồi nhận lại được những thái độ khinh khỉnh, dạy đời, chê bai khó chịu hơn nữa là câu nói kinh điển google để làm gì. Hình như nhiều bạn khi có chút kinh nghiệm rồi thì quên hết quãng time bắt đầu, có chút tự cao, mở miệng là chê :joy::joy::joy:.
Mong anh em suy nghĩ trên tinh thần giúp đỡ lẫn nhau đúng với cái tên của group. Bởi đơn giản chẳng biết trước tương lai nó ntn đâu.

2 Likes

Thật ra thì quan trọng nhất vẫn là chất lượng câu hỏi. Nếu câu hỏi có chất lượng thì dù là cơ bản vẫn có được nhiều câu trả lời nhiệt tình

2 Likes

Góp vui thôi.
Đôi khi cách dùng if else thực sự là một sự khác biệt.
Nó là một nghệ thuật.

1 Like

cái này hay quá, a giải thích cho e cái này được không ạ?

1 Like

Đầu tiên là phải có magic warning :smiley:
Sau đó là đọc thứ tự ưu tiên của phép tính chứ * | & tùm lum :smiley:

3 Likes

em ghi số ngày trong tháng ra rồi mò là được :joy::

số ngày trong tháng là
31 28 31 30 31 30 31 31 30 31 30 31
dễ thấy nó trồi sụt 30 31 chủ yếu, có tháng 2 28 là khó chịu, nếu ko có tháng 2 thì lấy 30 + f(m) với f(m) trả về 0 hoặc 1 tùy vào input tháng m là tháng mấy. Vì có tháng 2 nên đành lấy 28 + g(m)

g(m) hay số ngày trong tháng trừ đi 28 là
3 0 3 2 3 2 3 3 2 3 2 3
ta thấy nó chỉ có giá trị 0 tới 3, như vậy cần 2 bit encode cho mỗi giá trị này. Viết lại dưới dạng nhị phân:
11 00 11 10 11 10 11 11 10 11 10 11
viết liền lại là có số nhị phân 1100 1110 1110 1111 1011 1011 = 0xceefbb

nhưng giá trị này ko có ích cho lắm vì để tính lẹ g(m) ta thấy tháng 2 cần lấy 2 bit cao nhất, tháng 2 lấy 2 bit cao kế tiếp v.v…mà muốn lấy bit cao phải xài 1 cái “mặt nạ” rất bất tiện, vậy ta chuyển về bit thấp cho nó tiện: đảo ngược 12 giá trị 2 bit nhị phân kia lại:
11 10 11 10 11 11 10 11 10 11 00 11 = 1110 1110 1111 1011 1011 0011 = 0xeefbb3

tới đây g(m) có thể được tính bằng cách lấy (0xeefbb3 >> (2*(m - 1))) & 3 là được. Dịch phải 2 lần (m-1) bit ta sẽ có được 2 bit cuối là số cần cộng thêm vào 28 của tháng m, muốn lấy 2 bit cuối thì xài bitwise and với 0b11 hay 0x3 hay 3 là được.

nhưng viết vậy chưa đẹp lắm, m ở đây cần phải chuyển về 0-based thông qua m-1, ta có thể thêm 2 bit vào magic number 0xeefbb3 nữa để g(m) tính là (magic >> (2*m)) & 3 nhìn gọn hơn.
1110 1110 1111 1011 1011 0011 00 (thêm 2 số 0 vào cuối)
11 1011 1011 1110 1110 1100 1100 = 0x3bbeecc

magic hơi bị đẹp :joy: g(m) = (0x3bbeecc >> (2*m)) & 3. Ở đây cũng có thể bỏ nhân 2 mà đi dịch m bit 2 lần: (0x3bbeecc >> m >> m) & 3

vậy số ngày trong tháng có công thức là 28 + ((0x3bbeecc >> m >> m) & 3)

tới đây nhìn dấu () ngứa mắt quá, ta phải tra thứ tự ưu tiên toán tử để bỏ () đi. Ở đây >> có độ ưu tiên là 7, cao hơn & nên ta có thể bỏ 1 cặp () ở trong: 28 + (0x3bbeecc >> m >> m & 3)

để bỏ cặp () cuối cùng thì 1 lần nữa phải nhìn số ở hệ nhị phân: 28 chia hết cho 4 nên 2 bit thấp nhất của nó sẽ có giá trị là 00, g(m) của chúng ta trả về giá trị 0-3 chỉ có 2 bit, mà 0 bitwise or với bất kì số nào sẽ ra chính số đó, như vậy phép cộng ở đây có thể xài bitwise or | vẫn cho kết quả đúng như phép cộng: 00 + XY = XY, 00 | XY cũng = XY.

ta viết lại là 28 | (0x3bbeecc >> m >> m & 3). Vì thứ tự ưu tiên của bitwise or thấp hơn bitwise and nên ta chuyển 28 qua vế phải cho dễ nhìn và bỏ cặp () đi:
0x3bbeecc >> m >> m & 3 | 28.
Ngon lành, tính từ trái qua phải luôn dễ đọc. Tất nhiên compiler sẽ la làng xài & | ko có dấu () sẽ rất nguy hiểm nhưng ở đây ta tính hết rồi trình dịch khỏi lo =)))

28 | 3 & 0x3bbeecc >> month * 2 là đọc từ phải qua trái cho hack não ấy mà :V


vì còn phải tính năm nhuận cho tháng 2 nên có người bỏ qua tháng 2 28 ngày luôn mà đi cho tháng 2 là 30 hoặc 31 ngày, rồi encode lại dùng 30 + f(m) với f(m) chỉ trả về giá trị 1 bit là 0 hoặc 1, rồi trừ 3/2/1 gì đấy tùy năm nhuận hay ko là ra đúng số ngày trong tháng kèm năm nhuận. Nhưng magic number nó ko đẹp bằng 0x3bbeecc :V

7 Likes

Em theo cách của anh, năm nhuận cộng thêm 1 tí là được :grin:

def f(month, year):
	added = 0x10 * int(year % 400 == 0 or (year % 100 != 0 and year % 4 == 0))
	# aka `added = 0x10 if (year % 400 == 0 or (year % 100 != 0 and year % 4 == 0)) else 0`
	return 28 | 3 & (0x3bbeecc + added) >> month * 2


print(f(2, 2016))  # 29
print(f(2, 2019))  # 28
3 Likes

chời ơi, hay quá chời…
e ít làm việc với bitwise operator nên phải vừa đọc giải thích vừa tra google thêm mới hiểu được :smile:
Cảm ơn a và @rogp10, @noname00 nhé

1 Like

1 năm mà chỉ if else và loop thì nên xem lại, bản thân kém hay lập trình kém?

Để đây cho vui :laughing::laughing::laughing:






5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?