Должны ли мы использовать несколько необязательных операторов цепочки для одного и того же объекта или оператора if?

#typescript #optional-chaining

Вопрос:

Я работаю над приложением Angular2 и часто сталкиваюсь со следующей проблемой: у меня есть объект определенного типа , который может быть undefined , и мне нужно присвоить свойства этого объекта нескольким переменным или другим свойствам объекта, поэтому я обычно использую необязательный оператор цепочки, чтобы проверить, существует ли такой объект:

 observable$.subscribe((object: SomeInterface | undefined) => {
    this.var1 = object?.prop1;
    this.var2 = object?.prop2;
    this.var3 = object?.prop3;
});
 

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

 observable$.subscribe((object: SomeInterface | undefined) => {
    if (object) {
        this.var1 = object.prop1;
        this.var2 = object.prop2;
        this.var3 = object.prop3;
    }
});
 

Но в этом случае я чувствую, что читать код может быть сложнее?
Поэтому, я думаю, мой вопрос в том, что более эффективно (я думаю, второй вариант?) и что лучше использовать с точки зрения читаемости кода?

Комментарии:

1. Я предпочитаю второй подход для удобства чтения. Второе также, вероятно, более эффективно, но это почти наверняка не имеет значения

2. «Я чувствую, что читать код может быть сложнее» — Что в этом сложного ? if

3. Может быть, я привел плохой пример, но если нам нужно присвоить четвертой переменной какое-то подпространство, например this.var4 = object.prop4.subprop1 , и так далее, чем нам нужно писать дополнительные if операторы, и код может стать более сложным? Или, может быть, я просто выдумываю это

4. Я думаю, что один if-это нормально, но я бы не стал использовать несколько операторов if. На мой взгляд, необязательный подход к цепочке предпочтительнее, когда вы имеете дело с глубоко вложенными свойствами, которые являются независимыми. Т. е. некоторые из них могут присутствовать, а другие-нет. В случае, когда у вас есть все или ничего, именно здесь я нахожу единственную группу if более читаемой.

Ответ №1:

Определенно идите на второй подход. Одно утверждение if намного лучше, чем проверка каждой опоры.

Если вы беспокоитесь о удобочитаемости, вы можете написать это следующим образом

 object amp;amp; (this.var1 = object.prop1, this.var2 = object.prop2, this.var3 = object.prop3);
 

Но, с моей точки зрения, читаемость та же самая.

Ответ №2:

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

 observable$.pipe(filter(o => !!o)).subscribe((object: SomeInterface) => {
    this.var1 = object.prop1;
    this.var2 = object.prop2;
    this.var3 = object.prop3;
});