Hiển thị tốt hơn () + Ẩn () hoặc SetVisible (hiển thị bool)?


59

Điều gì là tốt hơn và tại sao? (Từ quan điểm thiết kế giao diện):

a) Có hai Show()Hide()chức năng

b) Có một SetVisible(bool visible)chức năng

EDIT: Ví dụ một số đối tượng có trạng thái hiển thị và chức năng này được sử dụng để thay đổi nó.

c) Có đủ các ba Show(), Hide(), SetVisible(bool visible)chức năng


4
Trong bối cảnh nào? Nói chung, điều đó không thành vấn đề
Manila Cohn


6
Tại sao không có tất cả chúng công khai? Có những trường hợp bạn biết chúng sẽ luôn được hiển thị hoặc ẩn và có những trường hợp bạn muốn hiển thị hoặc ẩn có điều kiện.
vui mừng

@pllee: Đó có lẽ là điểm rất tốt.
dùng3123061

4
Trong java, nó sẽ được đặtVisible, ẩn và hiển thị mà không có chữ in hoa bắt đầu.
Pierre Arlaud

Câu trả lời:


81

Tôi thích SetVisible(bool visible), bởi vì nó cho phép tôi viết mã khách hàng như thế này:

SetVisible(DetermineIfItShouldBeVisible());

thay vì phải viết

if (DetermineIfItShouldBeVisible()) {
    Show();
} else {
    Hide();
}

Cách SetVisibletiếp cận cũng có thể cho phép thực hiện dễ dàng hơn. Ví dụ, nếu một lớp cụ thể cụ thể chỉ ủy thác phương thức cho các lớp tổng hợp của nó, thì SetVisiblecó nghĩa là một phương thức ít hơn để thực hiện.

void ButtonWithALabel::SetVisible(bool visible) {
    myButton.SetVisible(visible);
    myLabel.SetVisible(visible);
}

25
Tương tự, bạn cũng có thể biến Visible thành một tài sản, giả sử ngôn ngữ của bạn hỗ trợ nó. MyObject.Visible = false;tấn công tôi như một thứ thậm chí còn trực quan hơnMyObject.SetVisible(false);
Brian

9
@Brian Đối với tôi nó ít đọc và gỡ lỗi hơn, bởi vì nó che giấu hành vi chương trình trước mắt tôi - cuộc gọi phương thức cơ bản - nhưng đó là một câu chuyện khác. Java không hỗ trợ cú pháp đó, dù sao đó cũng là vấn đề ưu tiên và rèn luyện mắt.
Ignis

10
SetVisible()không đề nghị (với tôi) rằng bạn thực sự đang hiển thị bất cứ điều gì. Nó đọc giống như bạn đang đặt thuộc tính hiển thị của một đối tượng, có thể để nó tương ứng với một phương thức Refresh()hoặc Redisplay()phương thức để kiểm tra giá trị của thuộc tính này để xác định xem đối tượng sẽ được hiển thị hay ẩn đi.
TMN

1
Thật không may, Java không hỗ trợ các thuộc tính như C #, chỉ các getters và setters mà bạn thấy ở trên.
theGreenCabbage

1
@TMN: Tôi hy vọng rằng trong trường hợp không có các yếu tố khác ngăn cản khả năng hiển thị (thứ tự Z, khả năng hiển thị của phụ huynh, vị trí, v.v.) setVisible(true)sẽ đặt ra trong quá trình mà đối tượng sẽ được rút ra khi hệ thống không hoạt động, nếu không trước đó. Tôi hy vọng rằng nó refreshcó thể hữu ích để đẩy nhanh việc hiển thị đối tượng, nhưng cuối cùng đối tượng sẽ được rút ra bất kể (trừ khi tầm nhìn của nó được đặt thành falsetrước khi điều đó xảy ra).
supercat

35

Tôi không đồng ý với tất cả các áp phích đề xuất nhiều chức năng để làm điều tương tự là một điều tốt. Trong khi ba chức năng thay vì người ta có thể không có vẻ như nhiều sưng lên, hãy nhớ rằng lớp học của bạn có thể sẽ kết thúc với nhiều chức năng như vậy (ví dụ như setEnabled, enable, disable) và do đó phương pháp này sẽ kết thúc với một nhiều giao diện lớp lớn hơn. Hơn nữa, có khả năng bạn sẽ kết thúc với một loạt các chức năng / thuộc tính âm tương tự / bất cứ thứ gì trong lớp của bạn và việc nhân các hàm sẽ làm mờ thêm cái nào đi với cái gì.

Trong các ngôn ngữ hỗ trợ các thuộc tính, chúng nên được ưu tiên nhưng vì cả Java và C ++ đều không làm được, tôi đoán đó là một điểm cần thiết.

Tôi nghĩ setVisible()nên được ưu tiên vì những lý do sau:

  1. Rõ ràng chức năng nghịch đảo là gì ngay lập tức. Để đảo ngược setVisible(false)bạn gọi setVisible(true)trong khi ngược lại hide()có thể dễ dàng reveal().
  2. Nó đơn giản hơn về mặt lập trình bất cứ khi nào bạn xác định trạng thái cần lấy mã, tức là bạn có thể gọi setVisible(wantToSee)thay vì sử dụng ifcâu lệnh.
  3. Khi bạn có nhiều chức năng tương tự, setX()định dạng tổng quát để bạn có thể có một tập hợp các hàm nhất quán trong khi cách tiếp cận được xác định sẽ tạo ra một loạt các chức năng có thể khó xác định nếu bạn không biết bạn đang tìm kiếm điều gì. Tính nhất quán trong API làm cho chúng dễ học và dễ nhớ hơn đáng kể.

3
C ++ không có thuộc tính, nhưng nó có các hàm miễn phí, vì vậy bạn có thể mở rộng giao diện lớp mà không cần thêm các hàm thành viên mới, tức là với mức độ khớp nối thấp hơn.
phresnel

Qt thường cung cấp cả ba để thuận tiện để có thể kết nối trực tiếp với ẩn () và show () với các sự kiện khác bằng hệ thống tín hiệu / khe cắm. Đây thực sự là một hạn chế của hệ thống khe cắm - nếu nó đang sử dụng một cái gì đó giống như các hàm boost ::, đối số đúng / sai có thể bị ràng buộc tại điểm thiết lập cuộc gọi lại.

1
"Trong các ngôn ngữ hỗ trợ các thuộc tính, chúng nên được ưu tiên nhưng vì cả Java và C ++ đều không làm như vậy, tôi đoán đó là một điểm cần thiết." không cần thiết. Ưu tiên cho getters / setters? Đúng. Nhưng set_visible không thực sự là một setter.
Miles Rout

19

Nó phụ thuộc vào những gì hiển thị và ẩn có nghĩa trong bối cảnh. Trước tiên, bạn muốn tìm ra cái nào là "cách chính" của bạn và tập trung vào phát triển nó:

  • Những lý do để chọn setVisible(bool)
    • Nó chỉ là một thao tác lật đơn giản hoặc đối tượng của bạn chủ yếu giữ trạng thái
    • Đối tượng của bạn sẽ dành phần lớn thời gian trong khung CRUD
    • Có rất nhiều mã dễ dàng chia sẻ giữa hiển thị và ẩn
  • Lý do để chọn show()hide()
    • Có một hiệu ứng phụ quan trọng hoặc rất nhiều logic đang được chạy, chẳng hạn như khi đối tượng phải kiểm tra tất cả các thùng chứa của nó để xem trạng thái hiển thị của chúng hoặc kích hoạt hoạt ảnh chuyển tiếp.
    • Đây có phải là một phần của mô hình miền trong đó việc thể hiện ý định là quan trọng

OK, vì vậy bây giờ bạn đã mã hóa lõi "tiêu chuẩn vàng" của nó, bạn cần tìm hiểu xem có đáng để thêm các phương thức tiện lợi mỏng theo kiểu khác hay không, để giúp mọi người sử dụng đối tượng của bạn dễ dàng hơn.

  • Thuận tiện setVisible(bool)
    • Cho phép bạn tránh các câu lệnh if có điều kiện tầm thường và chỉ ảnh hưởng đến khả năng hiển thị (ví dụ setVisible(a==b))
    • Có thể được kết nối vào các khung getter / setter nhất định, nếu điều đó đôi khi bạn mong đợi xảy ra
  • Thuận tiện show()hide()
    • Hữu ích trong một ngôn ngữ với các hàm và hàm gọi lại hạng nhất (ví dụ onSuccess(widget.show))
    • Dễ đọc hơn nhiều với dấu vết ngăn xếp và hồ sơ hiệu suất, vì bạn có thể nhanh chóng xem chương trình đang cố gắng làm gì

TLDR: Tìm ra cái nào là quan trọng nhất, thực hiện nó và sau đó tự hỏi liệu nó có đáng để thêm phong cách khác như các phương pháp tiện lợi mỏng hay không.


11

Tôi sẽ nói "cả ba".

Show()Hide()có xu hướng dễ dàng mò mẫm hơn SetVisible(true)SetVisible(false). Tuy nhiên, khi bạn muốn thiết lập mức độ hiển thị một cách hợp lý, tốt hơn là nên có một phương thức thực hiện boolthay vì xây dựng một ifxung quanh đó bool.

Bạn có thể hỗ trợ cả ba mà không cần nhân đôi logic và bản tóm tắt tối thiểu:

void Show() {
    foo.Show();
    bar.Show();
}

void Hide() {
    foo.Hide();
    bar.Hide();
}

void SetVisible(bool visible) {
    if (visible) {
        Show();
    } else {
        Hide();
    }
}

Ngoài ra, nếu những thứ bạn đang gói có SetVisibleAPI nhiều hơn :

void Show() {
    SetVisible(true);
}

void Hide() {
    SetVisible(false);
}

void SetVisible(bool visible) {
    foo.SetVisible(visible);
    bar.SetVisible(visible);
}

40
Microsoft sử dụng phương pháp này để bắt đầu và dừng lại System.Windows.Forms.Timer. Cá nhân, tôi thấy điều này là khó hiểu. Khi tôi nhìn thấy cả hai ShowSetVisible, thiên hướng đầu tiên của tôi là tự hỏi liệu có một số khác biệt quan trọng giữa hai chức năng.
Brian

1
Bạn có thể dễ dàng ghi lại chúng để loại bỏ sự nhầm lẫn đó. Tôi đã không làm vì đây là một ví dụ đơn giản.
Garry Shutler

20
Vì vậy, bây giờ tôi cần dành thêm X phút để đọc tài liệu trước khi tôi cảm thấy thoải mái khi sử dụng lớp học? Hoặc, thay vào đó, tôi cần lãng phí thêm X phút để bị nhầm lẫn (hoặc giới thiệu lỗi)? Chắc chắn, X là khá nhỏ đối với loại điều này, nhưng nó chắc chắn không phải là không. Cung cấp tất cả 3 tùy chọn có nghĩa là cung cấp gấp ba lần số chức năng cần thiết, điều đó có nghĩa là bạn dành nhiều tài liệu công việc hơn và tôi dành nhiều công việc hơn để học cách sử dụng lớp. Hơn nữa, nó giới thiệu một cách nữa để các nhà phát triển khác nhau không nhất quán khi sử dụng lớp của bạn.
Brian

5
Đây là một sự vi phạm rõ ràng về nguyên tắc Phân chia Giao diện, một trong những nguyên tắc RẮN. Một ý kiến ​​khác chống lại cách tiếp cận của bạn, đó là ý kiến ​​từ jaroslav tulach, nhà thiết kế của netbeans, đã khăng khăng rất nhiều lần chỉ cung cấp một cách để làm một điều trong một API trong thiết kế API thực tế của cuốn sách.
AlfredoCasado

@AlfredoCasado Tôi đồng ý. Điều gì xảy ra nếu SetVisible được bảo vệ ? Bạn có thể truy cập nó từ một lớp con, nhưng gọi đến một thực thể nhất định với giao diện này (chẳng hạn như API) sẽ phải là Hide / Show.
Pierre Arlaud

5

Tôi thích show () và hide (), trên thực tế, mọi phương thức nhận một boolean đều có thể được thay đổi cho hai phương thức tan thể hiện rõ hơn ý định của API. Ví dụ, Robert Martin trong mã sạch khuyến nghị các phương thức thích sử dụng các đối số bằng 0 so với các phương thức với một đối số.

Một lập luận quan trọng khác đối với tôi là khả năng đọc, theo tôi, mã tốt có thể được đọc như văn xuôi, văn xuôi thực sự kỳ lạ của nó giống như "main_window setVisible false" thay vì "main_window ẩn", bạn viết hay nói như vậy một cách bình thường? xây dựng ngôn ngữ trong các chương trình phần mềm khi hoàn toàn có thể sử dụng ngôn ngữ tự nhiên hơn?.


1
Không phải là văn xuôi lắp ráp đủ?
Alexander

Tôi hy vọng rằng chuỗi it.setVisible(false); it.setVisible(true);sẽ không ảnh hưởng đến khả năng hiển thị của cha mẹ của điều khiển, cũng như không ảnh hưởng đến thứ tự hoặc vị trí Z của điều khiển. Ngược lại , hide(); show(); hoàn toàn có thể buộc cha mẹ của một điều khiển có thể nhìn thấy được, di chuyển nó lên trên các điều khiển khác và giới hạn vị trí của nó ở một nơi nào đó có thể nhìn thấy. Trong một số trường hợp, thật hữu ích khi có một phương tiện để đảm bảo một cái gì đó thực sự có thể nhìn thấy (như đã nói ở trên show(), nhưng trong những trường hợp khác, thật hữu ích để thay đổi cờ hiển thị mà không thay đổi bất cứ điều gì khác.
supercat

Trong API hướng đối tượng không có "cờ", OO là về nhắn tin, nó nói về đối tượng khác thực hiện một số nhiệm vụ, không phải về việc thay đổi "cờ" là trạng thái của đối tượng. Bạn đang đưa ra rất nhiều giả định về kiểm soát, cha mẹ, sắp xếp theo thứ tự z và những điều mà BẠN mong đợi có lẽ dựa trên kinh nghiệm trước đây của bạn với các API khác, đó là một ý tưởng rất tồi khi thiết kế API dựa trên cảm xúc cá nhân và giả định về một miền.
AlfredoCasado

5

Tôi tin rằng phương thức này càng biểu cảm, càng dễ đọc và do đó, mã sẽ được duy trì. Hãy xem xét hai trường hợp sau:

Trường hợp 1:

void showCustomerData(customerId){
  Customer customer = getCustomer(CustomerId);
  customerPanel.setVisible(customer.isCustomerEnabled());
}

Trường hợp 2:

void showCustomerData(customerId){
  Customer customer = getCustomer(CustomerId);
  //always show customer panel
  customerPanel.setVisible(true);
}

Trong trường hợp đầu tiên, rõ ràng hàm "setVisible" đang làm gì, nhưng nếu bạn muốn đọc nó, bạn sẽ nói:

đặt bảng điều khiển khách hàng hiển thị nếu khách hàng được bật hoặc đặt bảng ẩn nếu khách hàng bị vô hiệu hóa.

Trong khi mô tả nhiều hơn để nói:

  • kiểm tra trạng thái của khách hàng:
    • nếu khách hàng được kích hoạt thì hiển thị bảng điều khiển của khách hàng
    • nếu không, hãy giấu nó đi

sẽ thay đổi chức năng "Trường hợp 1" thành như sau:

void showCustomerData(customerId){
  Customer customer = getCustomer(CustomerId);
  if(customer.isCustomerEnabled()){
    customerPanel.Show();
  }
  else{
    customerPanel.Hide();
  }
}

nó tạo ra nhiều mã hơn, nhưng dễ đọc hơn.

Trường hợp thứ hai có một lỗ hổng rõ ràng, đó là, bạn đã biết rằng bạn muốn hiển thị bảng điều khiển, vậy tại sao không sử dụng chức năng "Hiển thị"?

Tôi không nói rằng việc sử dụng "setVisible" là hoàn toàn sai, nhưng nó gây nhầm lẫn khi bạn cố đọc mã không được viết bởi bạn theo thời gian và nó không tuân thủ quy tắc "Một hàm chỉ nên thực hiện một thao tác".


Tôi sẽ nói : show customer panel iff the user/customer is enabled. Tôi đồng ý rằng có thể có nhiều điều kiện phức tạp hơn không dễ đọc như ví dụ của bạn, tuy nhiên, trong những trường hợp đó tôi sẽ chia những điều kiện đó thành các dòng khác nhau.
ComFalet

5

Tôi tin rằng Hide()/ Show()thay thế là hấp dẫn bởi vì nó dễ hiểu những gì đang diễn ra hơn so với SetVisible(true), trong khi có một chức năng duy nhất là thích hợp hơn vì nó tránh được nhiều điều kiện.

Nếu đó là trường hợp thì tôi khuyên bạn nên sử dụng một phép liệt kê làm đầu vào SetVisible, để bạn có được SetVisible(Visibility.Visible)hoặc SetVisible(Visibility.Hidden). Bạn có một chức năng duy nhất bạn có thể đọc ngay hành động đang được thực hiện.

Sử dụng các quy ước đặt tên của Java, bạn sẽ có thể setVisible(Visibility.VISIBLE)hoặc setVisible(Visibility.HIDDEN).


3

Tôi đồng ý với câu trả lời của Darien, nhưng muốn thêm một quan điểm từ góc độ lập trình viên C #.

Khi tôi thấy mã có nội dung 'setXXX', tôi đã đọc rằng nó nói rằng nó đặt giá trị cho một thứ, tôi không hy vọng điều này sẽ có tác dụng phụ trong việc đó ngoài việc đặt giá trị đó và tôi thực sự mong đợi điều này là bình thường (tức là tôi có thể tiếp tục đặt nó với cùng một giá trị và nó ổn). Nó giống như truy cập vào một lĩnh vực. Nói chung, tôi cũng mong đợi được xem phương thức 'getXXX' cùng với 'setXXX'.

Tôi không biết liệu đây có phải là những gì bạn mong đợi trong Java và C ++ hay không, nhưng đó là những gì tôi mong đợi ở C #, mặc dù trong C # có một bàn tay ngắn cho cái này được gọi là Thuộc tính. Và đây là một số hướng dẫn hay về cách sử dụng Thuộc tính ( http://msdn.microsoft.com/en-us/l Library / ms182181.aspx ).

Với quan điểm này, thì giao diện tôi chọn hoàn toàn phụ thuộc vào nếu có bất kỳ tác dụng phụ nào (ngoài việc thay đổi giá trị trường đó):

Nếu thực hiện hành động có tác dụng phụ, ví dụ: nó hiển thị hộp thoại thì tôi sẽ đi với "Show ()" và "Hide ()".

Nếu nó không có tác dụng phụ, giả sử tôi đang thiết lập mức độ hiển thị của "tiện ích" và một thứ khác biểu hiện tiện ích đó tùy thuộc vào trạng thái của nó thì tôi sẽ sử dụng setVisibility hoặc setIsVisible. (Tôi sẽ không gọi nó là SetVisible).

Trong C # (không chắc chắn về Java), việc áp dụng mẫu quan sát viên là khá phổ biến, trong đó khung UI sẽ lắng nghe các thay đổi đối với các đối tượng và sẽ tự động kết xuất lại UI khi một thuộc tính như Hiển thị thay đổi. Điều đó có nghĩa là việc đặt giá trị bằng cách gọi setIsVisible xuất hiện như thể nó có tác dụng phụ, nhưng theo định nghĩa của tôi thì không. Hợp đồng của widget được thực hiện bằng cách đặt giá trị trường đại diện cho "IsVisible".

Nói cách khác, tôi có thể chuyển đổi mức độ hiển thị của nhãn trên biểu mẫu trước khi biểu mẫu được hiển thị. Tức là nhãn.getIsVisible == true, nhưng hình thức không được hiển thị.

Tôi không thể gọi Hide () khi biểu mẫu không được hiển thị.


1
Mô tả getXXX()setXXX()phương pháp của bạn như là một cách để truy cập vào một trường mà không có tác dụng phụ nghe giống như Java và không phải là C #. Đây là cách bạn phải làm trong Java vì nó không có thuộc tính. Nếu tôi thấy mã như thế trong C #, tôi sẽ đoán nó được viết bởi một nhà phát triển Java, người chưa tìm hiểu về các thuộc tính trong C #.
gilly3

+1 cho SetVisibility.
akaltar

@ gilly3 - Vâng, tất nhiên. Và, "Thuộc tính" không tồn tại trong CLR, C # chuyển thành các lệnh gọi phương thức get_XXX và set_YYY trong IL. Quan điểm của tôi là: trong ngữ cảnh của câu hỏi, nếu bạn thấy setXXX, getXXX trong Java, bạn sẽ mong đợi nó hoạt động với ngữ nghĩa tương tự như các thuộc tính trong C #. Điều đó là đúng, sau đó tôi cho rằng các hướng dẫn tương tự cho các thuộc tính trong C # có thể áp dụng cho các cặp setXXX và getXXX trong Java. Tôi tình cờ đồng ý với các hướng dẫn mà tôi tham khảo trong bài viết và do đó tôi ủng hộ các hướng dẫn tương tự để sử dụng trong kịch bản này trong Java khi xác định giao diện.
Daniel James Bryars

1
Nó có thể giúp làm rõ rằng khi bạn có nghĩa là "tác dụng phụ", bạn có nghĩa là "khác với những thứ liên quan đến việc là một thứ" có thể quan sát được ". Quy tắc tôi ủng hộ là nói rằng nếu một getXXcuộc gọi có một setXXphương thức tương ứng , thì setYYkhông nên ảnh hưởng đến nó, nhưng nó có thể ảnh hưởng đến một getZZcuộc gọi không có setZZphương thức.
supercat

2

Tôi muốn đề xuất một giao diện được sửa đổi một chút:

Show();
Hide();
ToggleVisible();
ToggleVisible(bool visible);

Tên tốt hơn

Các tên phương thức này giúp nhà phát triển quyết định sử dụng phương pháp nào dựa trên những gì cần thực hiện. Trong khi đó SetVisible(bool visible)có thể gây nhầm lẫn cho một nhà phát triển vì nó truyền tải ý nghĩa ngữ nghĩa tương tự như Show()Hide(), Toggle()ngụ ý sự tồn tại của một điều kiện quyết định hành động. Do đó, nó trở nên trực quan cho nhà phát triển khi sử dụng từng phương thức.

Giảm dự phòng mã

Lợi ích của việc có nhiều phương thức trong giao diện của bạn là nó đơn giản hóa mã gọi. Bạn chỉ có thể phơi bày Show()Hide(), nhưng:

  • Bạn có thể yêu cầu một số loại SetVisible()phương thức riêng tư để thực hiện công việc thực sự đằng sau hậu trường (hoặc viết mã dự phòng cho Show()Hide()).
  • Mã gọi có thể có nhiều khối if / other dự phòng chỉ để chọn phương thức sử dụng. Điều này làm phồng mã theo ý kiến ​​của tôi.
  • Nếu tôi là người tiêu dùng, tôi có thể chỉ cần viết hàm bao bọc của riêng mình để thực hiện những gì SetVisible()(hoặc Toggle()) đã làm để tránh phình mã (tôi ghét mã dự phòng). Do đó, sao chép một phương thức có thể đã tồn tại như một phương thức riêng tư trong quá trình thực hiện.

1
Sao chép phương pháp nghe có vẻ hợp lý, mặc dù tôi sẽ không tự làm. Mặt khác, tôi không đồng ý rằng toggleVisible (bool) là trực quan. Đối với tôi, điều đó có nghĩa là nó nên chuyển đổi nếu thông qua trong bool là đúng, điều này khá lạ, nhưng tôi đã thấy người lạ. Nó sẽ không cho rằng đó thực sự là một chức năng được thiết lập để ngụy trang.
Patrick M

0

Tôi sẽ đề nghị sử dụng SetVisible(bool)nếu chỉ khi bật chế độ hiển thị hai lần (hiển thị và ẩn lại hoặc ẩn và hiển thị lại) sẽ khiến mọi thứ ở trạng thái cơ bản giống như trước khi thao tác được thực hiện (sẽ ổn nếu hiển thị và ẩn lại một cái gì đó hoặc ngược lại để các đối tượng cần vẽ lại, với điều kiện có thể được dự kiến ​​sẽ xảy ra "tự động"). Nếu việc ẩn và hiển thị một đối tượng sẽ không có tác dụng gì ngoài việc thay đổi một bit trạng thái, thì sẽ có ý nghĩa đối với mã bên ngoài để có một số phương thức chấp nhận tham số hiển thị và việc viết mã đó sẽ được hỗ trợ SetVisible.

Nếu ẩn và hiển thị lại một đối tượng có thể có tác dụng phụ như thay đổi thứ tự Z, thì các hành động đó rất có thể được thực hiện bằng các phương thức riêng biệt. Trong những trường hợp như vậy, tính hữu ích của các phương thức bên ngoài chấp nhận tham số "mức độ hiển thị" sẽ bị hạn chế, và do đó sẽ có rất ít lợi thế để tạo thuận lợi cho chúng. Hơn nữa, một SetVisiblephương pháp sẽ (sai) gợi ý rằng những thay đổi về khả năng hiển thị của các đối tượng có thể được thực hiện mà không có tác dụng phụ.

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.