Có những lợi thế cho các giá trị dữ liệu mã hóa cứng vào một chương trình?


13

Tôi là một lập trình viên tự học, mới làm quen, vì vậy tôi xin lỗi nếu tôi không đóng đinh các lập trình viên.

Tôi đang làm việc trong một dự án mà tôi đang cung cấp dữ liệu sẽ được cập nhật liên tục cho các nhà phát triển, những người về cơ bản sẽ tạo ra một công cụ để tạo báo cáo từ các truy vấn trên dữ liệu.

Dường như mọi người liên quan đều nghĩ rằng họ cần mã hóa các giá trị dữ liệu (không phải lược đồ, mà là chính các miền / giá trị) vào chương trình tạo báo cáo.

Ví dụ, giả sử chúng tôi đã báo cáo về nhân sự; báo cáo sẽ được chia thành các loại, với một tiêu đề cho từng bộ phận, và sau đó dưới mỗi tiêu đề của bộ phận sẽ là các tiêu đề phụ của chức danh, và dưới mỗi phân nhóm sẽ là một danh sách các nhân viên. Các nhà phát triển muốn mã hóa cứng các phòng ban và chức danh công việc. Mặt khác, tôi sẽ nghĩ rằng họ có thể / sẽ truy vấn những thứ đó trong thời gian chạy, sắp xếp các bản ghi theo chúng và tạo các tiêu đề báo cáo một cách linh hoạt dựa trên những giá trị nào ở đó.

Vì danh sách các giá trị tiềm năng sẽ thay đổi theo thời gian (ví dụ: các phòng ban sẽ được tạo / đổi tên, chức danh công việc mới sẽ được thêm vào), mã sẽ cần được cập nhật liên tục. Dường như với tôi rằng chúng ta có thể bỏ qua các bước bảo trì mã và tự động tổ chức các báo cáo.

Vì tôi không phải là nhà phát triển, tôi tự hỏi tôi đang thiếu gì. Những lợi thế nào có thể có đối với các giá trị mã hóa cứng vào một công cụ như thế này? Đây có phải là cách chương trình thường được thiết kế?



Các tab chéo báo cáo, có nghĩa là các giá trị trong các hàng sẽ xuất hiện dưới dạng cột?
Tulains Córdova

1
@Brendan - Nếu bạn cứng các giá trị mã trong báo cáo, bạn sẽ cần thay đổi danh sách ở HAI vị trí (nguồn dữ liệu và báo cáo) trong khi nếu báo cáo là động, bạn chỉ cần thay đổi nó ở một vị trí (báo cáo) .
kwah

1
@Brendan tại sao bạn sẽ kết thúc với ba địa điểm? Có lẽ sự hiểu biết của tôi là không chính xác nhưng tôi đang hình dung một truy vấn sql để tìm nạp dữ liệu từ cơ sở dữ liệu, ứng dụng sẽ tổng hợp / nhóm các giá trị được trả về bởi, ví dụ: bộ phận. Nếu bạn sẵn sàng có nhiều chi phí truy vấn db, bạn có thể chọn các bộ phận / tiêu đề vai trò riêng biệt nếu bạn thực sự muốn. Không có điểm nào là dữ liệu tồn tại ở nhiều hơn một vị trí - báo cáo đang được điều khiển bởi dữ liệu.
kwah

1
@Brendan Tôi cũng không đồng ý với định nghĩa của bạn về nó ở một nơi - cách bạn mô tả nó ở nhiều địa điểm, nằm rải rác trong mã nguồn.
kwah

Câu trả lời:


9

Wikipedia:

Mã hóa cứng (cũng là mã hóa cứng hoặc mã hóa cứng) đề cập đến thực tiễn phát triển phần mềm của việc nhúng những gì có thể, có lẽ chỉ khi nhìn lại, được coi là dữ liệu đầu vào hoặc cấu hình trực tiếp vào mã nguồn của chương trình hoặc đối tượng thực thi khác hoặc định dạng cố định của dữ liệu, thay vì lấy dữ liệu đó từ các nguồn bên ngoài hoặc tạo dữ liệu hoặc định dạng trong chính chương trình với đầu vào đã cho.

Mã hóa cứng được coi là một antipotype.

Được coi là chống mẫu, mã hóa cứng yêu cầu thay đổi mã nguồn của chương trình bất cứ khi nào dữ liệu đầu vào hoặc định dạng mong muốn thay đổi, khi người dùng cuối có thể thuận tiện hơn để thay đổi chi tiết bằng một số phương tiện bên ngoài chương trình.

Đôi khi bạn không thể tránh nó nhưng nó nên tạm thời.

Mã hóa cứng thường được yêu cầu. Các lập trình viên có thể không có giải pháp giao diện người dùng động cho người dùng cuối đã làm việc nhưng vẫn phải cung cấp tính năng hoặc phát hành chương trình. Điều này thường là tạm thời nhưng không giải quyết, trong một ý nghĩa ngắn hạn, áp lực để cung cấp mã. Sau đó, mã hóa mềm được thực hiện để cho phép người dùng truyền các tham số cung cấp cho người dùng cuối cách sửa đổi kết quả hoặc kết quả.

  • Mã hóa tin nhắn làm cho việc quốc tế hóa một chương trình trở nên khó khăn.
  • Đường dẫn mã hóa cứng khiến nó khó thích nghi với vị trí khác.

Ưu điểm duy nhất của mã hóa cứng dường như là cung cấp mã nhanh.


5
OK, nhưng "lợi thế duy nhất" thường cực kỳ quan trọng. Các quyết định thiết kế trong lập trình thường là về sự đánh đổi giữa việc kiểm chứng trong tương lai và giao hàng nhanh chóng và vì vậy, mã hóa cứng có thể là một lựa chọn hoàn toàn chấp nhận được. Đôi khi không khó mã hóa là một lựa chọn thiết kế tồi.

-1 Tôi không nghĩ đây là một câu trả lời hữu ích. Về cơ bản, nó nói rằng 'nhúng các giá trị vào mã nguồn không phù hợp' là không phù hợp. Tôi nghĩ OP muốn hướng dẫn về thời điểm mọi thứ có thể thuộc về mã nguồn và do đó nằm ngoài định nghĩa Wikipedia của bạn.
Nathan Cooper

Mã hóa cứng phải là một phần quan trọng trong quy trình của bạn và coi đó là một mô hình chống lỗi thời đã lỗi thời trong thời đại dịch vụ vi mô, với hướng dẫn Angular Tour of Heroes là một ví dụ điển hình của một nhà phần mềm khổng lồ trực tiếp hoặc thậm chí bắt buộc như một bước trung gian. Hơn nữa, khi bạn chuyển sang dữ liệu động, bạn vẫn nên giữ lại một số dữ liệu được mã hóa cứng như một bản sao lưu, có thể được điều khiển bởi một biến môi trường hoặc thậm chí là một boolean tự chuyển đổi mã để các lỗi và vấn đề bảo mật có thể được cách ly chính xác hàng.
Có gì trong Tìm kiếm của Google vào

24

Có thật không? Không có trường hợp sử dụng hợp lệ có thể?

Mặc dù tôi đồng ý rằng mã hóa cứng nói chung là một mô hình chống hoặc ít nhất là mùi mã rất xấu , có rất nhiều trường hợp có ý nghĩa:

  • đơn giản ( YAGNI ),
  • đầu vào thực sự là hằng số và sẽ không bao giờ thay đổi (nghĩa là nó đại diện cho hằng số tự nhiên hoặc kinh doanh hoặc xấp xỉ một. Ví dụ 0, PI, ...),
  • phần mềm nhúng (hạn chế bộ nhớ và phân bổ đến với tâm trí),
  • phần mềm bảo mật (các giá trị này không có sẵn và / hoặc dễ giải mã hoặc kỹ sư đảo ngược, ví dụ: mã thông báo và muối mã hóa),
  • mã được tạo (bộ xử lý trước hoặc trình tạo của bạn có thể định cấu hình được, nhưng tạo ra mã với các giá trị được mã hóa cứng),
  • và có lẽ một vài nữa

Vẫn là Anti-Pattern ? Vì vậy, là Over-Kỹ thuật ! Đó là về Tuổi thọ của Phần mềm của bạn !!

Không phải là tôi đang nói có tất cả lý do tuyệt vời, và nói chung tôi sẽ chùn bước trước các giá trị được mã hóa cứng. Nhưng một số có thể dễ dàng vượt qua vì lý do hợp lệ.

Và đừng giám sát cái đầu tiên về tính đơn giản / YAGNI bằng cách nghĩ nó tầm thường: có lẽ không có lý do gì để triển khai trình phân tích cú pháp và trình kiểm tra giá trị điên rồ cho một tập lệnh đơn giản thực hiện tốt một trường hợp cho trường hợp sử dụng hẹp.

Thật khó để tìm thấy sự cân bằng. Đôi khi bạn không thấy trước rằng một phần mềm sẽ phát triển và tồn tại lâu hơn so với tập lệnh đơn giản mà nó bắt đầu. Tuy nhiên, thông thường, đó là cách khác: chúng tôi chế tạo quá nhiều thứ và một dự án được hoãn nhanh hơn bạn có thể đọc Lập trình viên thực dụng. Bạn đã lãng phí thời gian và công sức cho những thứ hơn là một nguyên mẫu ban đầu không cần.

Đó là ý nghĩa của Anti-Forms: chúng có mặt ở cả hai cực phổ và sự xuất hiện của chúng phụ thuộc vào độ nhạy cảm của người xem xét mã của bạn.


Điều đó thật buồn cười, vì tôi đã tự mình điều khiển nó, và nó dễ dàng hơn và nhanh hơn và sạch hơn đối với tôi để xử lý các giá trị một cách linh hoạt. Tôi đã làm điều đó bằng Python, trong khi tôi tin rằng sản phẩm cuối cùng sẽ được mã hóa bằng Java - nếu điều này tạo ra sự khác biệt. Tôi cảm thấy quá sức khi tôi mã hóa các giá trị, bởi vì mỗi cột tiếp theo phải được theo dõi ở nhiều nơi.
Tom

@Tom: Bạn đang nói rằng việc triển khai (hoặc thậm chí tái sử dụng) thư viện tra cứu cấu hình dễ dàng và nhanh hơn so với sử dụng giá trị được mã hóa cứng? Tốt cho bạn. Ngoài ra, tôi không thấy câu cuối cùng của bạn phù hợp với định nghĩa của kỹ thuật quá mức. Nó sẽ cảm thấy rõ ràng là lộn xộn, và rõ ràng nếu nó được mã hóa cứng và sao chép thì nó thậm chí còn tệ hơn (đó không phải là điểm của câu hỏi của bạn, tôi có thể hiểu nhầm, nhưng dường như tôi nghĩ rằng giá trị của nó không được mã hóa cứng mọi lúc, nhưng trong một điểm duy nhất trong chương trình).
haylem

Dù sao, tôi chỉ chỉ ra những trường hợp hợp lệ. Tôi cũng chỉ ra rằng nó sẽ gây tranh cãi trong câu cuối cùng của tôi. Bạn không thể làm hài lòng tất cả mọi người và các đội có những người có trình độ kỹ năng khác nhau.
haylem

1
@Tom, đừng bán mình quá ngắn. Bạn chắc chắn về một cái gì đó. Nghe có vẻ dễ dàng hơn và tốn ít thời gian hơn để viết một thuật toán nhanh để sắp xếp dữ liệu bằng cách xem các trường Tiêu đề của Bộ và Công việc trái ngược với mã hóa cứng Department = ['IT', 'Sales', 'Operations', 'HR', 'Finance']. Việc duy trì mảng mã hóa cứng sẽ khó khăn hơn nhiều trong trường hợp Bộ hoặc Tiêu đề mới được giới thiệu.
Chris G

1
Bạn có thể có những thứ phức tạp hơn mà vẫn hợp lý với mã cứng. Một ý tưởng mà tôi đã viết cách đây vài năm là tất cả các hoán vị có thể có của một tập hợp các giá trị. Tôi cần tìm một hướng hợp lệ ngẫu nhiên, chọn một hoán vị ngẫu nhiên và sau đó lấy kết quả hợp lệ đầu tiên là giải pháp hiệu quả nhất và vì đó là hiệu quả của vòng lặp O (N ^ 3).
Loren Pechtel

4

Đôi khi nó ổn với các giá trị mã cứng. Ví dụ: có một số số như 0 hoặc một hoặc nhiều giá trị n ^ 2-1 khác nhau cho bitmasks cần phải là giá trị nhất định cho mục đích thuật toán. Cho phép các giá trị như vậy vào cấu hình không có giá trị và chỉ mở ra khả năng xảy ra sự cố. Nói cách khác, nếu thay đổi một giá trị sẽ chỉ phá vỡ mọi thứ, nó có lẽ nên được mã hóa cứng.

Trong ví dụ bạn đưa ra, tôi không thấy mã hóa cứng sẽ hữu ích ở đâu. Tất cả mọi thứ bạn đề cập sẽ / nên có trong cơ sở dữ liệu bao gồm các tiêu đề. Ngay cả những thứ thúc đẩy bản trình bày (chẳng hạn như thứ tự sắp xếp) có thể được thêm vào nếu chúng không có ở đó.


Cảm ơn. Thứ tự sắp xếp là một mối quan tâm tôi có. Tuy nhiên, trong trường hợp của chúng tôi, điều đó không thành vấn đề và tôi thậm chí còn không nghĩ rằng nó có thể được thêm vào như một bảng khác trong cơ sở dữ liệu.
Tom

1
Tôi nên lưu ý rằng việc quản lý tất cả những điều này trong DB là một tùy chọn. Bạn cũng có thể sử dụng các tệp cấu hình hoặc các giải pháp khác nhưng mã hóa cứng dường như là một lựa chọn kém. Tùy chọn DB thường được sử dụng vì dễ dàng tạo giao diện để cho phép người dùng quản lý các tùy chọn. Ngoài ra còn có các công cụ như thế này được thiết kế đặc biệt cho mục đích này.
JimmyJames

-1

Việc triển khai một giải pháp mạnh mẽ cho phép các giá trị có thể được mã hóa cứng thay vào đó có thể được cấu hình bởi người dùng cuối yêu cầu xác thực mạnh mẽ các giá trị đó. Họ đã đặt trong một chuỗi trống? Có phải họ đã đặt một cái gì đó không phải là số mà đáng lẽ nó phải là một con số? Có phải họ đang thực hiện SQL tiêm? Vân vân.

Mã hóa cứng tránh được rất nhiều rủi ro này.

Điều đó không phải để nói rằng mã hóa cứng luôn luôn, hoặc thậm chí thường xuyên, là một ý tưởng tốt. Đây chỉ là một trong những yếu tố cần tính đến.

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.