Bạn nghĩ gì về cú pháp if-then mới này [đã đóng]


11

Tôi chỉ nghĩ về thứ gì đó sẽ thực sự tuyệt vời khi có trong các điều khiển if-elif-other của tôi.


if condition:
    stuff()
elif condition:
    otherstuff()
then:
    stuff_that_applies_to_both()
else:
    stuff_that_doesnt_aply_to_either()

Vì vậy, về cơ bản a thensẽ được chạy khi bất kỳ điều kiện nào được chạy NGOẠI TRỪ điều kiện khác. Bạn có nghĩ rằng điều này là hữu ích? Nó tương tự như thử - ngoại trừ - khác của trăn.

Tôi nghĩ rằng một số bạn đang cố gắng thực hiện sơ bộ. Các thenkhối sẽ giống như các elsekhối trong một try-exceptkhối trong python. Lý do thực sự tôi đề nghị này là cho các tình huống như thế này.


m = {}
if condition == '1':
    m['condition'] = condition
elif condition2 == '3':
    m['condition2'] = condition2
elif condition3 == 'False':
    m['condition3'] = True
then:
    run_test_that_relies_on_one_of_the_conditions_being_true()

return m

Các thenkhối được phạm vi đầu tiên nếu giống như elselà. Vì vậy, làm tổ hoạt động tốt. Và nếu bạn cần chạy một phương thức trước câu lệnh if, điều đó thực sự không liên quan gì đến trường hợp sử dụng này.


Làm thế nào lồng nhau này có thể được?
aggietech

6
+1 để suy nghĩ bên ngoài hộp, nhưng tôi sẽ không bỏ phiếu để thực hiện nó. Xem câu trả lời của tôi tại sao dưới đây.
Wonko the Sane

1
Vậy 'sau đó' hoạt động như thế nào finallytrong Java?
Alex Feinman

1
Tôi thấy thencó một chút khó hiểu. Thường thenđược ngụ ý xảy ra sau một if. Ý tôi là, bạn đang nói if condition, then stuff()nhưng sau đó tiến hành nóithen stuff that applies to both
Matt Olenik

2
+1 cho một bài tập suy nghĩ thú vị, nhưng tôi đồng ý với các câu trả lời trong phần Ý tưởng tồi. Nó chỉ không trực quan, và tôi có thể thấy điều này THỰC SỰ vấp ngã một số lập trình viên.
BlairHippo

Câu trả lời:


17

Tôi nghĩ rằng nó trông thật kinh khủng. Nếu bạn muốn mã chạy sau nhiều điều kiện khác nhau thì (a) kiểm tra lại các điều kiện đó hoặc (b) đặt biến thành trạng thái thành công được chỉ định.


2
Tôi đồng ý - rất khó để hiểu ý nghĩa của nó mà không có lời giải thích như bạn đã đưa ra.
tcrosley

Tại sao yêu cầu một lời giải thích về cách một cái gì đó hoạt động quá nhiều để mong đợi?
Falmarri

5
Bởi vì nó làm cho mã khó đọc hơn.
Antsan

Tôi không thực sự chắc chắn điều đó công bằng. Mỗi cấu trúc trong mã phải được giải thích một lần.
Magus

14

Nói chung, bạn có thể thực hiện việc này với một công tắc / trường hợp và một công tắc / trường hợp cung cấp kiểm soát điều chỉnh tốt hơn đối với những gì bạn đang đề xuất.

Nó cũng không đọc đúng logic. Nếu A khác nếu B thì C. Không ngụ ý ai đó rằng C sẽ được thực thi nếu A hoặc B đánh giá là đúng.


2
Python không có báo cáo chuyển đổi / trường hợp
Falmarri

2
Tôi không nghĩ rằng câu hỏi được đặt trực tiếp vào câu trả lời của Python, nhưng nếu đó là ý định, xin hãy gắn thẻ như Python.
Brian R. Bondy

Chà, nó không trực tiếp nói về con trăn. Ví dụ là ở trăn. Nhưng nếu phản hồi của bạn về lý do tại sao điều này không cần thiết là "có câu lệnh chuyển đổi", thì trăn cũng không có.
Falmarri

1
@Falmarri: Đủ công bằng, vì vậy tôi đoán câu trả lời của tôi cho điều đó là Python sẽ tốt hơn để hỗ trợ các câu lệnh chuyển đổi cổ điển.
Brian R. Bondy

mã trong câu hỏi là trong Python không có nghĩa là câu hỏi là về Python, vì đó cũng có thể là mã giả. Nếu đó chỉ là về Python thì nó nên được gắn thẻ như vậy
phuclv

8

Thú vị, nhưng dường như đối với tôi (phải thừa nhận phần nào theo cách của tôi) một lời mời cho các vấn đề về khả năng đọc, logic và cú pháp.

Chỉnh sửa: if-elif của bạn rất đơn giản - nếu có 10 elif thì sao? 20? Tất cả các điều kiện cần phải là sự thật? Cơ hội của điều đó là gì?
If-elif của bạn rất đơn giản - nếu có 10 elif thì sao? 20? Điều đó sẽ không làm cho điều này khá khó đọc?

Ngoài ra, có thể dễ dàng đạt được bằng phương pháp đã được thiết lập thử và đúng:

if (thisCondition or thatCondition)
{
  if (thisCondition)
     stuff();
  else
     otherstuff();

    stuff_that_applies_to_both();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

Điều gì xảy ra nếu "Stuff_that_applies_to_both" cần xảy ra trước các bước riêng lẻ? Mã của bạn không xử lý trường hợp này:

if (thisCondition or thatCondition)
{
  stuff_that_applies_to_both();

  if (thisCondition)
     stuff();
  else
     otherstuff();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

Cuối cùng, cú pháp này cho phép linh hoạt hơn với nhiều điều kiện hơn: if (thisCondition hoặc thatCondition hoặc otherCondition) {Stuff_that_applies_to_all ();

  // Any combination of the three conditions using 
  // whichever logical syntax you'd like here
  if (thisCondition and anotherCondition)
     stuff();
  else if (thisCondition or thatCondition)
     stuff_number_2();
  else
     otherstuff();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

Tôi đã và đang sử dụng if / other, nhưng có thể dễ dàng sử dụng câu lệnh chuyển đổi với cờ:

Boolean conditionApplies = true;

switch (someConditionToCheck)
{
    case thisCondition:
      stuff();
      break;

    case thatCondition:
        otherStuff();
        break;

    default:
        stuff_that_doesnt_aply_sic_to_either();
        conditionApplies = false;
        break;
}

if (conditionApplies)
    stuff_that_applies_to_both();

Lưu ý rằng tôi thực sự không cần cờ conditionApplies - Tôi có thể đã thêm hàm "Stuff_that_applies_to_both ()" cho cả hai điều kiện không mặc định - Tôi chỉ làm điều này để nó trông giống cú pháp được xác định ở trên, mặc dù "sau đó" thay vì "cái khác".

Do đó, nó dường như là một cú pháp rất chuyên biệt, trong đó một cú pháp tổng quát hơn sẽ lấp đầy hóa đơn và hơn thế nữa.

+1 để nghĩ về một tính năng có thể (tiếp tục làm điều đó!), Nhưng tôi sẽ không bỏ phiếu để thực hiện nó.


1
+1 cho "phương pháp đã được thiết lập đúng và đã thử" - nếu có một giải pháp hợp lý cho một vấn đề, thì tốt nhất nên sử dụng nó :)
bedwyr

what if there were 10 elifs? 20? Would all conditions need to be true?Đó là không thể. chỉ có 1 elif có thể đúng vì nó dừng đánh giá nhiều hơn.
Falmarri

Lỗi của tôi - Tôi đọc nó là "và" khi bạn có ý "hoặc". Tuy nhiên, tôi đứng trước câu trả lời của mình - Tôi sẽ cập nhật nó từ những gì bạn đã chỉ ra.
Wonko the Sane

Bạn có thực sự nghĩ rằng cú pháp bạn đăng ở đây rõ ràng hơn những gì tôi đề xuất không? Bạn không chỉ kiểm tra điều kiện của mình hai lần mà việc không làm tổ luôn tốt hơn việc làm tổ
Falmarri

1
Cũng như của bạn, trừ khi "sau đó" của bạn thực sự áp dụng cho tất cả các điều kiện, khi bạn thêm càng nhiều trong số chúng, càng trở nên ít hơn. Và cá nhân, đến từ nền tảng C / C ++ / C #, tôi thấy lồng nhau khá khó hiểu hơn cú pháp phân tách (nghĩa là làm một cái gì đó ở đây trong "nếu" hoặc có thể là "elsif", và sau đó thực hiện nhảy xuống và làm gì đó khác trong "sau đó". Cá nhân tôi tìm thấy cú pháp dễ đọc hơn để có tất cả các điều kiện cùng nhau. Có thể không đúng, nhưng đó là một khái niệm vững chắc hơn trong thế giới hàng ngày của tôi.
Wonko the Sane

2

Tôi sẽ không phiền khi sử dụng một cái gì đó như thế này ngày hôm nay. Nhưng, để chắc chắn tôi sẽ sử dụng nó thường xuyên như tôi sử dụng lặp lại cho đến khi.

Mã ít nhất sẽ trông tốt hơn mà không cần lồng nhau. Mặc dù tôi thích Else Ifđến elif. Tôi sẽ thay thế Thenbằng Dovà cuối cùng Elsevới Otherwise.


Nói chuyện với những người tạo ra trăn chứ không phải tôi =]
Falmarri

Ồ, tôi nghĩ rằng bạn đang thiết kế một ngôn ngữ mới. Tôi chỉ đề nghị thay đổi tên chính xác hơn, để lại elif nếu bạn muốn, nhưng điều đó cuối cùng có vẻ như nó phải khác biệt với một cái khác thông thường.
Peter Turner

Chà, nó không nhất thiết phải là một ngôn ngữ mới, nhưng nó cũng không nhất thiết phải là con trăn. Chỉ là một ý tưởng mới cho một quy tắc cú pháp nói chung. Điều này có thể được áp dụng cho bất kỳ ngôn ngữ nào có tương đối ít tác dụng phụ.
Falmarri

0

Có vẻ như một ý tưởng tuyệt vời. Tuy nhiên, vấn đề duy nhất tôi tưởng tượng là bạn dễ bị lỗi hơn. Giống như viết một if / other if và gọi blah () sau đó. Viết thêm một thứ khác nếu điều đó không muốn blah, loại bỏ blah từ đó và thêm nó vào ifs / otherifs của bạn. Sau đó, khi bạn hoặc một lập trình viên khác thêm một tuyên bố khác, bạn có thể mong đợi blah được gọi nhưng không.

Hoặc bạn có thể có một vài if, viết một blah và quên tất cả các if nhưng một yêu cầu này sẽ phá vỡ một cái gì đó. Ngoài ra cơ hội là nếu bạn cần họ theo dõi mọi thứ nếu bạn đặt nó dưới khối if. Có thể thiết lập một bool khác (NoUpdate = true) và chỉ cần viết một if (! NoUpdate) {} ngay dưới đó rõ ràng hơn và có thể được đặt bởi if

Tôi chỉ nói rằng nó có vẻ dễ bị lỗi hơn, không phải là tôi không thích ý tưởng đó. Tôi không phiền khi thấy nó trong một ngôn ngữ nhưng tôi không thể tưởng tượng bất kỳ situtaion nào tôi sẽ sử dụng nó nếu ngôn ngữ của tôi hỗ trợ nó.


Possibly setting a bool in else (NoUpdate=true) and just write a if(!NoUpdate) {} directly under which is clearer and can be set by an ifĐây là chính xác những gì được cho là để ngăn chặn. Đó là toàn bộ quan điểm của một tuyên bố elif. Elif cũng không cần thiết, nó có thể được kiểm tra bằng các câu lệnh if, nhưng nó trở nên phức tạp.
Falmarri

0

Tôi thấy cú pháp của bạn khó hiểu, nhưng tôi thấy một số giá trị trong khái niệm. Về mặt khái niệm, khi tôi xem xét vấn đề, điều tôi thấy mình muốn là một "sự không rõ ràng", về cơ bản sẽ thực thi mọi thứ trong trường hợp cuối cùng elsekhông bắn. Nhìn từ góc độ đó, tôi sẽ gợi ý rằng người ta có thể đạt được kết quả tương tự thông qua:

  làm
  {
    nếu (điều kiện1)
      ... chỉ dành cho điều kiện1
    khác nếu (điều kiện2)
      ... chỉ dành cho condition2
    khác
    {
      ... không có điều kiện
      phá vỡ;
    }
    ... công cụ cho cả hai điều kiện
  } trong khi (0); // Điểm tiếp tục nghỉ

Một số tùy chọn khác có thể trong một số trường hợp là:

  if ((condition1 && (action1,1)) ||
       (điều kiện2 && (hành động 2,1)) ||
       (action_for_neither, 0))
    action_for_either;

Nhìn hơi khó chịu, nhưng trong một số trường hợp, có thể không có cách nào tốt để diễn tả chuỗi sự kiện mong muốn ngoài việc sao chép mã hoặc sử dụng goto(có thể không quá tệ, ngoại trừ phim hoạt hình ai đó có thể chèn vào đâ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.