Các lập trình viên đã làm gì trước phạm vi biến, nơi mọi thứ là toàn cầu?


40

Vì vậy, tôi phải đối phó với ngôn ngữ dường như lưu trữ (được gọi là PowerOn) nơi tôi có một phương thức chính, một vài kiểu dữ liệu để xác định các biến và có khả năng có các thủ tục phụ (về cơ bản là các phương thức void) không trả về một kiểu cũng không chấp nhận bất kỳ tranh luận. Vấn đề ở đây là MỌI THỨ là toàn cầu. Tôi đã đọc các loại ngôn ngữ này, nhưng hầu hết các cuốn sách đều nói "Ok, chúng tôi sử dụng ngựa và cariage, nhưng bây giờ, đây là một chiếc xe hơi để chúng ta học cách làm việc trên THAT!" Chúng ta sẽ KHÔNG BAO GIỜ sống lại những ngày đó " . Tôi phải thừa nhận, tâm trí đang vật lộn để suy nghĩ ngoài phạm vi và phạm vi .

Tôi đây rồi. Tôi đang cố gắng tìm ra cách quản lý tốt nhất không có gì ngoài các biến toàn cục trên một số phương thức mở . Đúng, thậm chí các vòng lặp cho forcác vòng lặp phải được định nghĩa toàn cầu, mà tôi thấy mình tái chế trong các phần khác nhau của mã.

Câu hỏi của tôi: đối với những người có kinh nghiệm loại này, làm thế nào các lập trình viên đối phó với một lượng lớn các biến trong một sân chơi toàn cầu? Tôi có cảm giác nó chỉ trở thành một trò lừa bịp tinh thần, nhưng tôi sẽ quan tâm để biết liệu có bất kỳ lời xin lỗi nào được biết đến không.


71
Họ đã cầu nguyện rất nhiều.
Robert Harvey

15
Tôi có thể tưởng tượng rất nhiều tên biến điên rồ có phạm vi gần đúng - bob_dog_fur_colourv.v ... để thử và giảm cơ hội đánh cùng tên.
Latty

12
Họ đã viết các chương trình có phạm vi nhỏ hơn và họ có rất nhiều lỗi.
Charles E. Grant

12
@Lattyware, thực sự trở lại trong những ngày xưa, bạn rất hạn chế về cách bạn có thể mô tả tên biến của mình. Một số ngôn ngữ chỉ cho phép 1 hoặc 2 tên biến ký tự, những ngôn ngữ khác cho phép bạn có tới 8. Nó bị hút, nhưng chúng tôi không biết nó đã hút bao nhiêu sau đó. Nó đã cho phép trình biên dịch nén vào một lượng bộ nhớ hạn chế.
Charles E. Grant

17
họ phát minh ra ngôn ngữ lập trình tốt hơn ...
Wim

Câu trả lời:


44

Bạn sẽ cần một số loại thủ thuật ghi sổ tinh thần (quy ước đặt tên, v.v.) để giữ cho nó thẳng. Ngoài ra, tài liệu, tài liệu, tài liệu. Vì tất cả các biến là toàn cục, nên có một tài liệu với tất cả các biến được liệt kê, nếu bạn có thể.

Cố gắng có một số lượng nhỏ các biến mà bạn luôn sử dụng cho tạm thời và nhớ rằng HỌ LÀ TẠM THỜI. Bằng cách liên tục sử dụng lại những cái tương tự, bạn sẽ có thói quen theo dõi xem chúng có hợp lệ hay không.

Ngoài ra, bạn muốn xem tài liệu và đảm bảo bạn biết tên biến có thể dài bao nhiêu và có bao nhiêu ký tự thực sự là duy nhất. Tôi không biết gì về PowerOn, nhưng nếu nó đủ cổ xưa để chỉ có phạm vi toàn cầu, thì có thể nó có độ dài duy nhất hạn chế trên các số nhận dạng.

Tôi đã nhìn thấy mọi thứ trước đây với các định danh dài, nhưng số nhận dạng chỉ là duy nhất trong 8 ký tự đầu tiên. Vì vậy, bạn có thể có RonnyRayGun và RonnyRayBlaster và chúng thực sự là biến CÙNG. Trong những trường hợp như vậy, tôi khuyên bạn nên giữ các tên biến trong giới hạn 'duy nhất' để bạn ít có khả năng vô tình va chạm.


4
1 +1 không liên quan ở đây). Có một vài thanh ghi dành riêng cho các giá trị tạm thời thực sự giúp giữ số lượng biến được tạo, giúp giữ mọi thứ trong đầu bạn dễ dàng hơn. Tài liệu về các biến mà mỗi chức năng sẽ sử dụng (quan trọng nhất là nó sẽ sửa đổi) giúp hình ảnh toàn cầu trở nên đúng đắn.
Leo

53

Từ điển dữ liệu.

Trong một kho lưu trữ trung tâm (thường là văn phòng của lập trình viên chính), có một chất kết dính looseleaf, chứa một trang cho mỗi và mọi biến toàn cục. Trang này đã đưa ra tên, định nghĩa, mục đích của nó và các thói quen được đặt hoặc sử dụng nó.

Các hệ thống nhúng ban đầu với RAM siêu nhỏ có vấn đề tương tự và một giải pháp tương tự. Lập trình viên chính duy trì bản đồ RAM chính, xuống từng byte riêng lẻ, hiển thị RAM được sử dụng bởi mô-đun nào cho mục đích nào. Các lập trình viên cần phân bổ RAM chuyên dụng đã tìm đến lập trình viên chính, người sau khi thảo luận về vấn đề này, đã đưa ra mục nhập máy tính xách tay phù hợp và đưa cho anh chàng RAM của mình. (Bạn không muốn ở vị trí của lập trình viên đã lấy byte RAM mà không xóa nó với lập trình viên chính. Hãy tin tôi vào điều này.)

Vấn đề này cũng xuất hiện khi các lập trình viên phải xây dựng các hệ thống lớn trong các phiên bản đầu của BASIC. Nó hiển thị cho cá nhân tôi khi sử dụng trình quản lý "cơ sở dữ liệu" rất nguyên thủy có tên là Info (sản phẩm của Henco, Inc. ở New Jersey - HOPEFULLY đã mất từ ​​lâu!). Cả hai ngôn ngữ này có vốn từ vựng tên biến rất hạn chế.


Tôi đang ở trong một tình huống rất giống với nó là một trình quản lý "cơ sở dữ liệu" nơi ngôn ngữ giao tiếp trực tiếp với cơ sở dữ liệu, cùng với một số chương trình như chức năng. Điều này rất hữu ích
Chad Harrison

1
Điều đó khiến tôi nhớ lại khi tôi học BASIC và các biến không thể có tên dài hơn hai ký tự và theo dõi chúng trong một chương trình khá lớn ...
Kevin Rubin

@KevinRubin, đừng nhắc tôi. Ah cảm thấy đau đớn, như Bill Clinton thường nói ...
John R. Strohm

8

Sự gia tăng của các ngôn ngữ lập trình với phạm vi khối trùng khớp với sự ra đời của các máy nhanh hơn, lớn hơn và đó không phải là sự trùng hợp ngẫu nhiên. Các máy tính ban đầu có RAM được đo bằng MB, kB hoặc thậm chí bằng byte; đơn giản là không có cơ hội để thậm chí nhiều biến số đến mức chúng sẽ bị nhầm lẫn khi chương trình trở nên lớn, bởi vì các chương trình không bao giờ lớn đến thế . Những tiến bộ trong ngôn ngữ lập trình thường được thực hiện khi mọi người nhận ra rằng thói quen lập trình cũ của họ không mở rộng khi đấu trường trở nên rộng lớn hơn nhiều; phạm vi khối được phát minh như một cơ chế bảo vệ cho các lập trình viên chống lại bộ nhớ hạn chế của chính họ.

Điện toán cũng là một hoạt động hiếm hoi và kỳ lạ hơn nhiều khi các máy tính đồng tiền cực kỳ đắt đỏ, và có lẽ chỉ những cá nhân có khuynh hướng toán học và khéo léo mới trở thành lập trình viên ngay từ đầu (mặc dù những so sánh như vậy là không thực tế để kiểm tra, và chắc chắn là chính trị). Trong những ngày đầu, phần mềm thường được vận chuyển miễn phí với một máy tính để thuyết phục mọi người mua nó ngay từ đầu; ý nghĩ rằng người dùng tổ chức thậm chí sẽ cố gắng viết chương trình của riêng họ lúc đầu chưa biết.


Bạn đang nói về bao xa Cá nhân tôi đã thấy một vài máy tính mini từ đầu thập niên 80 có 'datapool' (nghĩa là một danh sách biến toàn cục) có chứa hơn 60K nhãn.
Evan Plaice

-1: Trong những ngày đầu, bạn không chỉ trả tiền thuê hàng tháng để có quyền truy cập vào máy tính, bạn đã trả tiền cho chu kỳ CPU và bộ nhớ được sử dụng bởi chương trình của bạn. Phần mềm không phải là miễn phí, và chạy phần mềm thậm chí còn ít hơn thế.
mattnz

1
@mattnz: Quay lại một thời gian trước, phần mềm thường được gói, điều này hơi khác so với miễn phí. Thông thường, một doanh nghiệp cần một máy tính sẽ mua hoặc thuê một chiếc và không trả tiền cho việc chạy máy, mặc dù người dùng cá nhân thường sẽ bị tính phí cho việc đó. Tôi cũng bối rối trước tuyên bố của OP rằng mọi người sẽ không viết phần mềm của riêng họ, vì đó chắc chắn không phải là kinh nghiệm của tôi. Nếu bạn có thể mua một máy tính, bạn có thể đủ khả năng cho một nhân viên phát triển và thực sự không có nhiều phần mềm đóng hộp ngoài kia.
David Thornley

Các vấn đề với lập trình phạm vi đơn được nhận ra khá sớm, rất lâu trước khi máy tính có nhiều megabyte bộ nhớ. ALGOL, ngôn ngữ đầu tiên có phạm vi từ vựng, xuất hiện vào năm 1958.
kevin cline

4

Chúa ơi, đó là nhiều năm trước (những kỷ niệm sủi bọt :)).

Tôi không biết ngôn ngữ bạn đề cập đến, nhưng nói chung chúng tôi thích nghi với những gì chúng tôi đã có. Đó thực sự không phải là một vấn đề lớn. Bạn cần chú ý nhiều hơn đến các tên var thường chứa (ở dạng ngắn, trong những ngày đó số byte là quý) tham chiếu đến phụ hoặc hàm, như mIORead1nếu bạn có một trình xử lý để đọc dữ liệu từ tệp 1 hoặc bạn có nhiều dữ liệu khác nhau các quầy truy cập như i, j, k, v.v. mà bằng hệ thống của riêng bạn, bạn biết chúng dùng để làm gì, nếu chúng có thể được tái sử dụng và vv. Đó là khó khăn hơn (sau đó không có mũ bảo hiểm hoặc găng tay) :-)


3

Điều này khá giống với lập trình PLC, mặc dù các PLC hiện đại bây giờ cho phép bạn có "thẻ" (còn gọi là biến) là cục bộ của chương trình. Tuy nhiên, rất nhiều người chỉ lập trình bằng cách sử dụng tất cả các thẻ toàn cầu.

Tôi đã tìm thấy, nếu bạn sẽ làm điều đó, bạn cần sử dụng quy ước đặt tên có cấu trúc. Ví dụ : Motor1_DriveContactor_Run. Nếu ngôn ngữ của bạn xảy ra với các cấu trúc hỗ trợ (đôi khi được gọi là các loại do người dùng xác định) thì bạn cũng có thể sử dụng các cấu trúc đó để tạo cấu trúc phân cấp dữ liệu có cấu trúc, chẳng hạn như : Motor[1].DriveContactor.Run.

Điều đó giữ cho mọi thứ có tổ chức, và thường thì intellisense là đủ để giúp bạn đi cùng.


2

Tôi thực sự đã học lập trình bằng một ngôn ngữ gọi là Authorware, nơi mọi thứ đều mang tính toàn cầu. May mắn thay, nó đã có Mảng và sau một thời điểm nhất định, một cái gì đó gọi là Danh sách, tương tự như các đối tượng chung.

Một chương trình Authorware thực sự có cấu trúc vật lý (Authorware dựa trên phép ẩn dụ biểu đồ dòng chảy) và ngôn ngữ kịch bản của nó dựa trên Pascal kiểu cũ. Những gì chúng ta đã làm là liên kết cấu trúc vật lý với các chỉ mục trong một mảng và thường thì các chỉ mục Array sẽ chứa các Danh sách mà chúng ta coi là một đối tượng cục bộ cho phần vật lý mà chúng ta đang sử dụng.

Authorware được thiết kế cho eLearning, vì vậy một trong những biểu tượng chúng tôi có là Trang. Các trang sẽ được đính kèm vào một Khung. Vì vậy, đối với Trang 1, chúng tôi sẽ tìm kiếm một số Mảng ở chỉ mục 1 (Phần mềm tác giả được lập chỉ mục 1) và lấy dữ liệu cho trang đó, sẽ được lưu trữ một Danh sách sẽ hoạt động như một đối tượng giả. Trang sau đó sẽ có logic sẽ lấy ra các "thuộc tính" của đối tượng theo tên. Nếu bạn không có bất cứ thứ gì như Đối tượng, nhưng bạn có Mảng, bạn có thể chỉ cần có một quy ước về dữ liệu sẽ đi đâu.

Nó không thực sự khác với những gì chúng ta làm khi lấy dữ liệu từ cơ sở dữ liệu và thực hiện tiêm phụ thuộc, ngoại trừ mọi thứ thực sự toàn cầu, và bạn chỉ đơn giản là chọn đặt mọi thứ vào các ô nhỏ và chỉ nhìn vào (các) bạn Đang quan tâm với ngay bây giờ.

Tùy thuộc vào những gì bạn đang cố gắng làm và những gì ngôn ngữ của bạn hỗ trợ, điều này có thể giúp bạn ít nhất chia nhỏ mọi thứ thành nhiều phần dễ quản lý hơn.


Tôi cũng đã làm việc với Macromedia Authorware, @ amy-blankenship. Tôi không nhớ phiên bản nào là lần cuối cùng tôi làm việc với nó, có lẽ 3. Nó đã được thay thế bởi Flash / Showckwave hay nó vẫn tồn tại?
Tulains Córdova

Chúng là những thứ khác nhau. Macromedia gây ra nhiều nhầm lẫn trong phiên bản 5 (của cả hai) bằng cách gọi mọi thứ Shockwave, bao gồm cả Director, khi được đóng gói cho web. Phần mềm ủy quyền đã bị Adobe ngừng cung cấp sau khi mua lại, Flash vẫn còn tiếp tục.
Amy Blankenship

1

Khi tôi ở trường đại học, chúng tôi đã được dạy về "Vấn đề biến toàn cầu" - một tập hợp các lỗi và vấn đề bảo trì mã gây ra bởi rất nhiều biến số toàn cầu.

Một số biến nguy hiểm hơn các biến khác.

An toàn : Các biến không ảnh hưởng đến luồng kiểm soát, ví dụ: LastName

Nguy hiểm : Bất kỳ biến nào ảnh hưởng đến luồng kiểm soát của chương trình, ví dụ DeliveryStatus

Nguy hiểm nhất trước tiên:

  • Trạng thái hợp chất (chế độ và chế độ phụ)
  • Giá trị tổng hợp (tổng, tổng phụ)
  • Trạng thái đơn (chế độ)
  • Giá trị đơn (tính)

Để tránh "vấn đề biến toàn cục", bạn cần phải

  • Tài liệu từng biến và chức năng.
  • Giữ các biến liên quan gần nhau (với mã sử dụng chúng) trong cùng một phần của mã nguồn.
  • Ẩn các biến "nguy hiểm", vì vậy các lập trình viên khác không biết đến sự tồn tại của chúng. Tránh sử dụng chúng trực tiếp, đặc biệt là trong các phần khác của mã.
  • Cung cấp các hàm đọc / ghi các biến nguy hiểm (để các lập trình viên khác không cần).

Để cấu trúc mã của bạn , khi không có cấu trúc có sẵn trong ngôn ngữ, hãy sử dụng các nhận xét và quy ước đặt tên:

/* --------------------------- Program mode ------------------------ */

var Mode_Standard = 1;      // Normal operation (SubMode unused)
var Mode_Backup   = 2;      // Backup mode      (SubMode is backup device)

var BackupMode_Disk = 1;    // SubMode: Backup to disk
var BackupMode_Tape = 2;    // SubMode: Backup to tape

var MainMode = Mode_Standard;
var SubMode = 0;

function Mode_SetBackup(backupMode)
{
    MainMode = Mode_Backup;
    SubMode = backupMode;
}

function Mode_SetStandardMode()
{
    MainMode = Mode_Standard;
    SubMode  = 0;
}

function Mode_GetBackupMode()
{
    if (MainMode != Mode_Backup)
        return 0;

    return SubMode;
}

/* --------------------------- Stock Control ------------------------ */

var Stock_Total =  123;      // Total stock       (including RingFenced)
var Stock_RingFenced = 22;   // Ring-fenced stock (always less than total)

// Adds further ring-fenced stock 
function Stock_AddRingFenced(quantity)
{
    Stock_Total      += quantity;
    Stock_RingFenced += quantity;
}

/* ------------------------- Customers ----------------------- */

var Customer_FirstName = "Tony";
var Customer_LastName  = "Stark";

0

Không biết họ đã làm thế nào.

Nhưng tôi nghĩ rằng các ngôn ngữ OOP hiện đại có một vấn đề rất giống nhau về xung đột đặt tên .

Giải pháp là áp dụng không gian tên . Đây là một khái niệm trừu tượng, nhưng được áp dụng rộng rãi bởi một số triển khai (gói Java, không gian tên .NET, mô-đun Python).

Nếu ngôn ngữ bạn đang sử dụng không quá giới hạn về cách đặt tên theo chiều dài, thì bạn có thể áp dụng không gian tên cho việc đặt tên biến tốt.

Vì vậy, tên biến cũng đại diện cho phạm vi biến.

Cố gắng xác định một mô hình đặt tên như thế này: order_detail_product_code, order_detail_product_unit_price. Hoặc cho các quầy tạm thời hoặc hoán đổi: tmp_i, tmp_swap.


0

Trong các ngôn ngữ là tất cả các biến là toàn cục (tôi đã sử dụng một vài) chúng tôi đã sử dụng một quy ước đặt tên biến. Ví dụ: nếu tôi thực sự muốn sử dụng một biến là toàn cục, tôi có thể sử dụng tiền tố "m_" hoặc "_". Tất nhiên điều này vẫn dựa vào các nhà phát triển để có kỷ luật này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.