Какой стиль кодирования Вы используете для тернарного оператора? [закрытый]

Почти все ответы либо используют Reflections, либо читают файлы классов из файловой системы. Если вы попытаетесь прочитать классы из файловой системы, вы можете получить ошибки при упаковке своего приложения как JAR или другого. Также вы можете не использовать отдельную библиотеку для этой цели.

Вот еще один подход, который является чистой java и не зависит от файловой системы.

import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.StandardLocation;
import javax.tools.ToolProvider;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

public class PackageUtil {

    public static Collection<Class> getClasses(final String pack) throws Exception {
        final StandardJavaFileManager fileManager = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null);
        return StreamSupport.stream(fileManager.list(StandardLocation.CLASS_PATH, pack, Collections.singleton(JavaFileObject.Kind.CLASS), false).spliterator(), false)
                .map(javaFileObject -> {
                    try {
                        final String[] split = javaFileObject.getName()
                                .replace(".class", "")
                                .replace(")", "")
                                .split(Pattern.quote(File.separator));

                        final String fullClassName = pack + "." + split[split.length - 1];
                        return Class.forName(fullClassName);
                    } catch (ClassNotFoundException e) {
                        throw new RuntimeException(e);
                    }

                })
                .collect(Collectors.toCollection(ArrayList::new));
    }
}

Java 8 не является обязательным. Вы можете использовать для циклов вместо потоков. И вы можете проверить это так

public static void main(String[] args) throws Exception {
    final String pack = "java.nio.file"; // Or any other package
    PackageUtil.getClasses(pack).stream().forEach(System.out::println);
}
53
задан ysth 12 November 2008 в 07:51
поделиться

14 ответов

Тернарного оператора нужно обычно избегать, но эта форма может быть довольно читаемой:

  result = (foo == bar)  ? result1 :
           (foo == baz)  ? result2 :
           (foo == qux)  ? result3 :
           (foo == quux) ? result4 : 
                           fail_result;

Таким образом, условие и результат держатся вместе на той же строке, и довольно легко скользить вниз и понять то, что продолжается.

87
ответ дан Simon Howard 7 November 2019 в 18:15
поделиться

Вложенные тернарные операторы PHP ведут себя по-разному.

Этот синтаксис проходит все следующие тесты. На основе http://deadlytechnology.com/web-development-tips/php-ternary-syntax/

$myvar = ($x == $y)
?(($x == $z)?'both':'foo')
:(($x == $z)?'bar':'none');

.

См .: http://au.php.net/ternary

Пример № 3 «Неочевидное тройное поведение» объясняет, почему следующее не работает в PHP:

$x = 1;
$y = 2;
$z = 3;   
$myvar = ($x == $y) 
       ? "foo" 
       : ($x == $z) 
         ? "bar" 
         : "none";  
$myvar == 'none'; // Good

$x = 1;
$y = 2;
$z = 1;   
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";  
$myvar == 'bar'; // Good

$x = 1;
$y = 1;
$z = 3;   
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";  
$myvar == 'bar'; // Bad!

$x = 1;
$y = 1;
$z = 1;   
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";  
$myvar == 'bar'; // Bad!
14
ответ дан 7 November 2019 в 08:15
поделиться

Я лично только использую его для присвоения переменной (в Java), например:

String var = (obj == null) ? "not set" : obj.toString();

и (другой пример) при использовании функции, которая не позволяет пустой параметр, такой как:

String val; [...]
int var = (val == null) ? 0 : Integer.parseInt(val);
0
ответ дан Vinze 7 November 2019 в 18:15
поделиться
$foo = (isset($bar)) ? $bar : 'default';
0
ответ дан 7 November 2019 в 18:15
поделиться

Imran, Вы отформатировали это красиво. Однако тернарный оператор действительно имеет тенденцию становиться нечитабельным, поскольку Вы вкладываете больше чем два. если еще блок может дать Вам дополнительный уровень понятного вложения. Кроме того, используйте функцию или табличное программирование.

0
ответ дан Yuval F 7 November 2019 в 18:15
поделиться

Я склонен не использовать тернарный оператор вообще, поскольку я нахожу если.. еще намного более читаемый.

0
ответ дан SmacL 7 November 2019 в 18:15
поделиться

Я не использую его. Это всегда пахло мне как попытка оставить свободное место и ввод в исходном коде с ожиданием что маленький источник == более эффективный скомпилированный код.

я не нахожу его читаемым вообще, но большая часть этого - то, потому что я просто никогда не использую его.

0
ответ дан Tim 7 November 2019 в 18:15
поделиться

Я склонен включать условие в круглые скобки: (== b)? 1: 0

4
ответ дан Guillaume Gervais 7 November 2019 в 18:15
поделиться

тернарные операторы являются короткими эффективными способами записать простой если операторы. Они не должны быть вложены или не трудные читать. Помните: Вы пишете программное обеспечение однажды, но, читается 100 раз. Должно быть легче читать, чем запись.

10
ответ дан Rick Kierner 7 November 2019 в 18:15
поделиться

I стиля иногда использование, которое я поднимаю, так как это не было упомянуто, похож на это:

$result = ($x == y)
        ? "foo"
        : "bar";

.. но обычно только если помещение всего этого на одной строке делает его слишком долго. Я нахожу, что, имея = ? : все выстраиваются в линию, заставляет его выглядеть более опрятным.

15
ответ дан nickf 7 November 2019 в 18:15
поделиться

Я пытаюсь не использовать тернарный оператор для записи вложенных условий. Это игнорирует удобочитаемость и не обеспечивает дополнительного значения по использованию условного выражения.

, Только если это может соответствовать на одной строке, и это совершенно ясно, что это означает, я использую его:

$value = ($a < 0) ? 'minus' : 'plus';
77
ответ дан Tomalak 7 November 2019 в 18:15
поделиться

Лично, я только использую тернарный оператор, если он соответствует на одной строке. Если это должно охватить, то время для старого доброго

if else if else
24
ответ дан biozinc 7 November 2019 в 18:15
поделиться

Я возражу с единым мнением. Я - вид подобного Imran с моим стилем условного оператора. Если это соответствует чисто на одной строке, я сохраняю его на одной строке. Если это не соответствует чисто на одной строке, я действительно повреждаю его, но я использую только единственную вкладку (4 пробелов; мне установили VS для вставки пробелов для вкладок) для отступа. Я сразу не перехожу к if - else, потому что много времени условный оператор имеет больше смысла контекстуально. (Если это не имеет смысла контекстуально, однако, я просто не использую его.)

кроме того, я не вкладываю условные операторы. В той точке я действительно нахожу слишком трудным читать, и пора перейти к более подробному if - else стиль.

2
ответ дан John Rudy 7 November 2019 в 18:15
поделиться

"Изобретенный пример" то, как я расположил бы его с отступом, за исключением того, что я сделаю отступ от левого поля, не на основе того, где (или независимо от того, что находится на строке выше.

троичным хулителям - удобочитаемость является точкой. Если Вы не думаете, что это делает для большего количества читаемого кода, не используйте его. Но я нахожу вопреки иметь место, по крайней мере, часть времени.

1
ответ дан ysth 7 November 2019 в 18:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: