Pull to refresh
36
0
Евгений @reforms

Back-End Разработчик

Send message
Спасибо за альтернативу. Единственное что VS Code показывает IvanUser, но суть уловил
>> Вывод типов в дженериках
Немного дополню. Иногда вывод типа нужно сделать для экземпляров некоторого класса, например:
class User {
    constructor(readonly lastName: string, readonly firstName: string) {}
}
// Хочется, чтобы IVANOV имел строго то, что написано в конструкторе (lastName - "Иванов", firstName - "Иван")
const IVANOV = new User("Иванов", "Иван");
// Вывод типа >> const IVANOV: User
// Не заработает const IVANOV = new User("Иванов" as const, "Иван" as const);

На помощь приходит простое решение, но почему-то про него забывают
// Тогда  конструкции нужно видоизменить. Декларация конечно монстр
class User2<LN extends string, FN extends string> {
    constructor(readonly lastName: LN, readonly firstName: FN) {}
}
const IVANOV2 = new User2("Иванов", "Иван");
// Вывод типа >> const IVANOV2: User2<"Иванов", "Иван"> 


Если кто подскажет как сделать такое без дженериков буду признателен
Настолько затянуло чтиво по ссылкам, что совсем забыл про работу. Спасибо.
По всей видимости я упускаю вашу мысль насчет сложных объектов, но разве это не решается таким образом:
const attrsFilter = `$attributes.name == ${filter.attribute.name}`;
А что думаете по поводу шаблонных языков в качестве фильтров для поиска и решения Вашей проблемы? Для указанных в статье данных это могло бы выглядеть так:
// Человеко читаемый фильтр по пользователям
const usersFilter = `$age == 23 AND $name CONTAINS 'mary'`;
const filteredUsers = yourLib.filter(users, usersFilter);

// Человеко читаемый фильтр по группам
const groupFilter = "$list.name CONTAINS 'Li' OR $groups.groups.list.name CONTAINS 'Li'";
const filteredGroups = yourLib.filter(groups, groupFilter);

// Можно заменить константы, например, через template строку
const userFilters2 = `$age == ${filterValue.age} AND $name CONTAINS '${filterValue.searchText}'`;

Мастером коммуникации на мой взгляд можно стать в 2 случаях:
1) У Вас талант от природы к коммуникациям и вы его развиваете (явно не про интроверта)
2) У Вас неотложные обстоятельства требующие быть мастером, например, должность президента при наличие внутренней мотивации к изменениям (интроверт? — мало вероятно)
Все остальное — это подорожание и издевательство над собой: Вы ведь другой — тихая гавань снаружи и безграничная фантазия внутри)


Очень странно, что пункт Узнавайте себя стоит на 6 месте, почему не на первом???

Понять, нужен ли представленный функционал в принципе и есть ли у него хорошее описание

Зачем вообще ставить задачу на функциональность, которая не нужна?

Обратить внимание на самое важное в измененном коде и то, насколько хорошо решение спроектировано в целом

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

Скорость проведения ревью: отвечайте быстро

Мне кажется это самый важный пункт из статьи, если не в ущерб качеству. И чем быстрее будет получен ответ тем лучше.

Если честно, немного не понятно, зачем плодить модульные broadcast и сами $module, когда можно общаться через единую шину (в примере $rootBroadcast) с помощью сообщений, одним из обязательных параметров которого будет имя модуля. причем, если нет желание писать имя модуля в событии явно, его также можно задекларировать в прототипе вуя как $moduleName. Наличие класса типа ModuleEvent даст возможность понимать где какие события отсылаются/обрабатываются. Это может быть полезным при погружении и фикса багов.

Вы бросили достойный вызов легаси. Могу пожелать терпения и удачи.


В рамках эксперимента, нашей команде была поставлена обратная задача — запустить java(апплет) приложение в браузере (разумеется никак апплет, а как js приложение. В апплете более 5тыс классов, свой LookAndFeel, Swing и прочие вещи. В это трудно поверить, но с помощью CheerpJ и 2 напильников нам удалось за 2 дня достичь успеха в этом деле.


По проделанной Вами работы, хочется понять в целом — это разумно js под граалем запускать?

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

Чем меня разочаровал Typescript и стоит ли он того?

Отвечу за автора — да стоит и всем советую.
Красивый ответ. Я бы добавил еще про номинативную типизацию как подход. Даже стать я на хабре есть
Да, а еще так :)
validate(<OneField> badData)
validate(badData as OneField)


К сожалению, я не нашел способа запретить указание дженерика
Спасибо, действительно хорошее дополнение для статьи. В продолжение — попробовал добавить тип, который допускает передачу только объектов того же типа.
type OneField = {
    id: string;
}
type TwoField = {
    id: string;
    data?: string;
}

type DiffType<Free, Strong> = Omit<Free, keyof Strong>
type Constraint<Free, Strong> = Record<keyof DiffType<Free, Strong>, never>
type DirectType<Free, Strong> = Free & Constraint<Free, Strong>

function validate<Free>(data: DirectType<Free, OneField>) {
    // do some work
}

const okData: OneField = null;
const badData: TwoField = null;

validate(okData);
validate(badData); // Ошибка!!!
В 2017 году мне тоже был интересен этот вопрос, тогда я решил задачу в лоб с помощью кодогенерации и проверил эмпирически для java7. Статья на хабре здесь — ответ в секции Эксперимент. У меня получилось
столько
2746

Убрал под спойлер из уважения к автору этой статьи, так как он обещает продолжение
В месте с дефолтными методами в интерфейсе появилась и очень интересная задача — как вызвать дефолтный метод у интерфейса через рефлексию? Ответ здесь
В конце статьи не хватает эпичной фразы из упомянутого сериала: Я все сказал.
Из интересного, на мой взгляд, можно отметить еще и шаблоны (дженерики)
public class Records {
    public static void main(String[] args) {
        new Point<Integer>(1, 2).print();
        new Point<String>("11", 2).print();
    }

}

record Point<T>(T x, int y) {
    void print() {
        System.out.println("" + x + " - " + y);
    }
}

Если кто не видел сюда про 52!

Как идея, что думаете над таким подходом взамен multi-release jar?
package one.util.streamex;

class VersionSpecificDetector {

    static VersionSpecific get() {
        boolean j9 = System.getProperty("java.version", "").compareTo("1.9") > 0;
        if (j9) {
            try {
                Class<?> j9class = Class.forName("one.util.streamex.Java9Specific");
                return (VersionSpecific) j9class.newInstance();
            } catch(ClassNotFoundException | InstantiationException | IllegalAccessException mixe) {
                // Обработка ошибки должным образом
                // use j8 impl
            }
        }
        // j8
        return new Java8Specific();
    }
}

interface VerSpec {
    VersionSpecific VER_SPEC = VersionSpecificDetector.get();
}


Где VersionSpecific — это интерфейс

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity