Có phải tốt hơn để gọi một chức năng không có hiệu lực tại thời điểm đó, NẾU nó cải thiện độ rõ của mã?


60

Tôi có ba lượt xem trong chương trình của mình (ứng dụng iOS). Chỉ một trong số chúng hoạt động cùng một lúc nên tôi tắt chế độ hiển thị cho hai trong số chúng và chuyển chế độ hiển thị khi người dùng nhấn nút. Các khung nhìn được khởi tạo là có thể nhìn thấy được vì vậy tôi đặt chế độ hiển thị trong mã trước khi chế độ xem chính hiển thị.

tôi có thể làm

[view1 setAlpha:0.0f];
[view2 setAlpha:0.0f];

đối với hai trong số các chế độ xem, nhưng bây giờ quan điểm thứ ba (quan điểm sẽ hiển thị khi bắt đầu ứng dụng) không được đề cập. tôi đặt một

[view3 setAlpha:1.0f];

sau hai lần đầu tiên, vì tôi nghĩ rõ ràng rằng trên thực tế có ba quan điểm chứ không phải hai như người ta có thể nghĩ khi xem mã. Làm thế nào để các lập trình viên khác làm điều này? Đó có phải là ưu tiên hoàn toàn hay có một số quy ước?

Nếu cuộc gọi rất nặng, rõ ràng tốt hơn là không gọi nó khi không cần thiết, nhưng tôi đã tự hỏi về những điều nhỏ nhặt như ví dụ của tôi.

Câu trả lời:


134

Bạn có một bất biến:

Chỉ một chế độ xem duy nhất (trong số 3) là hoạt động (và hiển thị).

Sau đó, tôi khuyên bạn nên cung cấp một chức năng để chuyển đổi hoạt động và khả năng hiển thị của TẤT CẢ các chế độ xem cùng một lúc:

[setActiveView viewID:2]

Chức năng này sẽ:

  • kiểm tra xem chế độ xem đã hoạt động chưa, tránh các công việc không cần thiết
  • đặt chế độ xem là hoạt động và hiển thị
  • đặt 2 chế độ xem khác là không hoạt động và vô hình

Nó có nhiều lợi thế về một cuộc gọi thô đến setVisibility:

  • thân thiện: gọi nó không cần thiết không tạo ra vấn đề hiệu suất
  • phòng thủ: tham số duy nhất của nó khó khăn hơn nhiều để botch, trong khi setVisibilityđó để nhớ rằng phạm vi của các giá trị là khó hơn 0.0f - 1.0fvà chỉ có một giá trị phải được đặt thành1.0f
  • kiên cường: chàng trai tiếp theo không thể vô tình quên một trong những quan điểm
  • có thể thích ứng: thêm / xóa chế độ xem không yêu cầu xem xét kỹ tất cả mã ứng dụng để tìm vị trí của các công tắc, một chức năng (cái này) cần được cập nhật

Lý tưởng nhất là để giúp thực thi bất biến, không có chức năng nào khác có thể gây rối với cài đặt này ...


Đề nghị tuyệt vời. Tôi sẽ làm điều này với ví dụ hiện tại của tôi. Nhưng những gì về thiết kế như vậy là không thể / muốn? Hay bạn quyết định tại chỗ cách tốt nhất để xử lý nó là gì?
Kevin

4
@Kevin: Nó thực sự phụ thuộc. Đôi khi bạn có thể giải quyết vấn đề bằng cách lặp qua một bộ sưu tập, đôi khi thì không, nhưng nguyên tắc chính là tránh trùng lặp và giúp dễ dàng bảo tồn các bất biến. Càng nhiều hành động "thủ công" cần được ghi nhớ để mọi thứ hoạt động tốt, bạn càng có ít cơ hội để mọi thứ hoạt động tốt. Tôi ghét phải mơ hồ ở đây, nhưng có rất nhiều tình huống khác nhau đến nỗi tôi sợ một quy tắc "chung chung" sẽ khiến bạn lạc lối.
Matthieu M.

23
"Làm cho nó dễ dàng để bảo tồn bất biến" là một quy tắc chung đáng ghi nhớ.
Gusdor

1
@Tonny: Tôi không biết nếu khuyến khích sử dụng biến toàn cục là "làm đúng", nhưng thực sự nếu bạn biết chính xác hoạt động nào trước đó, bạn chỉ cần cập nhật hai chế độ xem. Một giải pháp khác là cho mỗi chế độ xem ghi nhớ tầm nhìn của nó và setVisibilitykhông làm gì nếu tầm nhìn đã được yêu cầu, điều này làm giảm trách nhiệm.
Matthieu M.

1
@MatthieuM. Tôi đã viết vội vàng, nhưng thực ra đó là những gì tôi muốn nói. Nếu bạn biết trạng thái trước đó, bạn chỉ cần cập nhật tối đa 2 lượt xem. Làm thế nào để nhớ trạng thái đó là một vấn đề khác ;-). Về việc chuyển trách nhiệm xuống: Nếu lớp xem không cung cấp cho điều đó, bạn sẽ cần phải bọc lớp trong một đối tượng khác chỉ để thêm thuộc tính đó. Đó là một giải pháp sạch, nhưng có thể hơi quá mức cần thiết.
Tonny

12

Ý tưởng thay thế: nếu mục tiêu của bạn là ngăn chặn các lỗi xảy ra do mọi người quên có ba chế độ xem và làm điều gì đó chỉ với hai trong số họ thực sự nên làm với tất cả chúng, thì hãy tạo một chức năng khiến bạn không thể quên:

setViewVisibilities(0.0f, 0.0f, 1.0f)

Bây giờ bạn có một thứ gì đó mạnh mẽ hơn nhiều - thời gian biên dịch đảm bảo bạn không bị lãng quên . Nếu bạn quên một tham số, trình biên dịch sẽ mắng bạn. Điều này hữu ích hơn nhiều so với các bình luận hoặc mã không cần thiết, vì nó tạo ra một giao thức có tên nghiêm ngặt để thực thi tài sản mà bạn quan tâm.

Đối với trường hợp view3không cần nó tầm nhìn thay đổi, bạn có thể thêm một số hành vi nơi đi qua một giá trị đặc biệt như -1.0hoặc nilhoặc một cái gì đó dọc theo những đường có nghĩa là "không thay đổi khả năng hiển thị xem ở tất cả". Điều này xoay quanh vấn đề thiết lập khả năng hiển thị không cần thiết.


9
Nếu OP có tới hơn 10 lượt xem, một tham số cho mỗi lượt xem sẽ không thể duy trì. Quan điểm của bạn về lỗi thời gian biên dịch là chính xác, nhưng đây là một giải pháp rất không thể nhầm lẫn, thật không may.
Chris Cirefice 17/08/2015

3
@ChrisCirefice: Nếu số lượt xem tăng lên, bạn có thể tạo một số loại đối tượng / lớp "ViewState", thực thi bất biến này. Sau đó sử dụng nó để chuyển đổi, vv Với rất nhiều lượt xem, một số loại đối tượng người quản lý có thể có ý nghĩa nào.
sleske

8

Tôi sẽ tin rằng việc thêm một bình luận giải thích rằng cuộc gọi là không cần thiết (và tại sao) là tốt nhất.

(có lẽ, thực tế là một cuộc gọi là không cần thiết hoặc bạn cần nhận xét về điều đó, có thể là mùi mã)


1
@Niall Nếu có thể, một khẳng định sẽ còn tốt hơn một bình luận.
200_success

9
Nhận xét không phải là giải pháp cho mã không thể
nhầm

2
@Kevin hoặc bạn có thể viết mã hoàn toàn dễ đọc mà không cần bình luận.
ngày

1
@Jan Nhận xét không chỉ đơn giản là giải thích mã nào .......
Kevin

2
@Kevin Tôi muốn nói rằng các bình luận không bao giờ tồn tại để giải thích mã nào, mà là để giải thích tại sao nó lại làm như vậy. Và trong những tình huống như vậy thường thì một người tái cấu trúc sẽ có được ý định mà không cần bình luận (nghe có vẻ giống quan điểm của Jan).
RJFalconer

4

Trong trường hợp cụ thể này, @Mattieu M. có giải pháp phù hợp.

Trong trường hợp tổng quát hơn, khi không có biến đổi tương tự, bạn phải tự hỏi: Có khả năng nào một lập trình viên tương lai có thể làm hỏng điều này không?

Câu trả lời thường là có. Có nghĩa là, vâng, bạn nên thêm cuộc gọi. Có thể một số phiên bản tương lai của khung bắt đầu với tất cả các lượt xem TẮT thay vì BẬT.

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.