Tại sao không nên khai báo biến có scope là global?

Đây là ngôn ngữ ABAP (SAP). Anh chị cho em hỏi tại sao lại như này ạ mặc dù cả 2 cách cho kết quả như nhau?

:one: Cách 1 (chạy bình thường - không lỗi - có warning)

DATA VARIABLE_1 TYPE STRING VALUE 'Hello Word'.

WRITE VARIABLE_1.

Tool Programming Guidelines hiện warning (không phải error) thông báo: Do not declare variable globally.


:two: Cách 2 (chạy bình thường - không lỗi - không warning)

Chuyển thành cách này thì không còn warning nữa

* Lời gọi hàm
PERFORM MAIN.

* Khai báo hàm
FORM MAIN.
       DATA VARIABLE_1 TYPE STRING VALUE 'Hello Word'.
       WRITE VARIABLE_1.

      PERFORM MODULE_1.
      PERFORM MODULE_2.
ENDFORM.

FORM MODULE_1.
* ..... code here
ENDFORM.

FORM MODULE_2.
* ..... stuff code
ENDFORM.

Theo code convention thì cả chương trình nên chỉ có 1 function main ý nghĩa tương tự hàm main là entrypoint trong java, C# nhưng không đúng lắm vì do em tự đặt tên nó là MAIN thôi.

Em cảm ơn.

Sau này bạn làm việc với project vài trăm MB source code trở lên, và cứ hở tí lại khai báo biến global thì khó tổ chức lắm, có trường hợp vì nhiều tên biến global có sẵn quá nên không biết phải đặt tên gì cho biến mới chẳng hạn…

Sử dụng global variable thường xuyên phá vỡ kiến trúc “hướng đối tượng”.

Biến global cũng gây tốn kém bộ nhớ nếu không thường xuyên sử dụng đến…

Và nhiều lý do khác nữa…

4 Likes

Trong OOP không có khái niệm global variable thì phải mà chỉ có class variables (static variable) và instance variable đúng không anh?
Biến trong paradigm functional programming như C và đoạn code bên trên mới có khái niệm global variable đúng không anh? chứ trong java, C# biến mà khai báo ngoài method gọi là instance variable?

bạn đã đọc tài liệu OOP nào mà đúc kết ra được những kiến thức đó vậy?

2 Likes

Dạ đây anh https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html
oracle không định nghĩa biến global. Không biết em sai chỗ nào, mong được chỉ bảo.

trong bài viết không có nhắc tới OOP, chỉ đơn thuần là variables java
từ bài viết như thế, bạn lại quy chụp cho OOP nói chung, và thậm chí là C#?

2 Likes

Bạn @kisuluoibieng cũng đã nói đến việc “chế ra kiến thức” Phân biệt functional programming và procedural programming .
Khi mới học, khoan suy luận/ suy nghĩ quá nhiều thành ra quy nạp sớm một cách thiếu căn cứ.
Java là một ngôn ngữ OOP => không có nghĩa là Java chinh là OOP, không nhất thiết mọi cái trong Java đều là đặc tính của OOP.

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