• Чем отличается onion-architecture от n-layer-architecture?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    n-layered архитектура - это просто архитектура построенное на рандомном количестве слоев. оно определяет базовые принципы разделения ответственности и все такое, но на этом все.

    onion - тут уже идет уточнение, что мол в самом сердце у нас core-domain, сущности, базовые бизнес правила. От него уже идет дальше domain layer, application layer и т.д. То есть сначала мы проектируем core-domain а потом уже все остальное.

    Есть еще гексагональная - это опять же уточнения для n-layered архитектур, что мол каждый слой отделен друг от друга за счет dependency inversion. На границах слоев всегда есть интерфейсы, а у внешнего слоя - реализация. Потому ее называют "архитектура портов и адаптеров".
    Ответ написан
    2 комментария
  • Как разворачивать программу при запуске копии этой программы?

    petermzg
    @petermzg
    Самый лучший программист
    Вот
    Идея. Именованный мьютекс + отправка сообщения.
    Ответ написан
    Комментировать
  • Как организовать хранение данных в c# WPF (программа - заучивание иностранных слов)?

    petermzg
    @petermzg
    Самый лучший программист
    А зачем вам вообще база данных. Обьем данных у вам не большой, разрастаться не будет, многопользовательский доступ не нужен. Храните данные в обычных Json или Xml файлах.
    Ответ написан
    1 комментарий
  • Как организовать хранение данных в c# WPF (программа - заучивание иностранных слов)?

    Для локальной базы может хватить и .mdb, провайдер вшит во все актуальные версии Windows.
    Можно выбрать и SQLite, на официальном сайте есть информация о том, какие библиотеки нужно таскать за проектом, чтобы он запускался на конечных машинах.
    Ответ написан
    Комментировать
  • Как работает C#?

    Рекомендую книгу Рихтера "CLR via C#"
    Ответ написан
    Комментировать
  • Можно ли использовать скрипты в проекте C#?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    Неудачно ник себе выбрали. Даже как-то объяснять не хочется.
    Ответ написан
    1 комментарий
  • Задачи на сериализацию?

    @yakovenkodenis
    JavaScript, Node.js, React, PostgreSQL
    Напиши векторный графический редактор с возможностью сохранения (сериализации) изображения в файл и чтобы потом можно было загрузить сериализованный файл в программу и продолжать работать с места сохранения. Можно еще добавить возможность объединения изображений из двух сериализованных.

    Довольно простая задачка, но всё же)
    Ответ написан
    Комментировать
  • Почему не работает foreach?

    @EvilBeaver
    упоротый гик
    Блин, что за адово нагромождение if/else, сделайте уже таблицу переходов. И где там у вас foreach, который не работает? Вы предлагаете нам самим его искать и угадывать тот ли это foreach? Если хотите получить ответ на вопрос, потрудитесь облегчить работу тем, кто будет отвечать.

    if (che.GetType().ToString().IndexOf("CheckBox") > -1)


    ААААА!!!!! Срочно напишите заявление об увольнении, ну нельзя же так, господи!!!
    Ответ написан
    3 комментария
  • Как скопировать все пользовательские файлы, папки, раскиданные по всему диску С:\ в одно место?

    Spetros
    @Spetros
    IT-шник
    Можно написать скрипт, который найдет файлы принадлежащие определенному пользователю.
    Но это имеет смысл если на компьютере работали пользователи с нескольких разных учеток.
    Eсли пользователь один - то все созданные файлы будут его(кроме нескольких стандартных системных папок) и проще всё проделать вручную.

    Скрипт, подсказанный гуглом - blog.wadmin.ru/2010/09/find-files-by-owner
    Ответ написан
    3 комментария
  • Как скопировать все пользовательские файлы, папки, раскиданные по всему диску С:\ в одно место?

    Neuroware
    @Neuroware
    Программист в свободное от работы время
    Если поставить задачу иначе, например все папки с фото отдельно, все папки с музыкой отдельно и т.п. по описуемым критериям, то такую задачу решить можно.
    В таком же виде как сейчас вам как минимум нужен исскуственный интелект, который на основе всего вашего жизненного опыта будет выделять "нужное" и оставлять "ненужное", это как говорится повторите запрос позже, числа так через 50 лет.
    Ответ написан
    5 комментариев
  • Как запустить Task после его выполнения?

    @mayorovp
    Я немного не понял, вам надо запускать задачи последовательно или параллельно? А если параллельно - то обрабатывать результаты сразу или вместе?

    1. Последовательный запуск:
    private async void OnlyLike()
    {
        for (var i=0; i<5; i++)
            TextBox.Text += await VK.NakrytkaLike(KeyAntigateTextBox.Text);
    }


    2. Параллельный запуск, обработка всех результатов вместе
    private async void OnlyLike()
    {
        var tasks = Enumerable.Range(0, 5).Select(i => VK.NakrytkaLike(KeyAntigateTextBox.Text));
        foreach (var result in await Task.WhenAll(tasks))
            TextBox.Text += result;
    }


    3. Параллельный запуск, обработка результатов сразу же:
    private async void OnlyLike()
    {
        TextBox.Text += await VK.NakrytkaLike(KeyAntigateTextBox.Text);
    }
    
    private void StartButton_Click(object sender, RoutedEventArgs e)
    {
        for (var i=0; i<5; i++)
            OnlyLike();
    }


    Выбирайте что нравится. И не бойтесь использовать async/await - оно создано для упрощения кода, а не для усложнения :)

    UPD

    Последовательный запуск на фреймворке 4.0:
    public void OnlyLike()
    {
        var scheduler = TaskScheduler.Current ?? TaskScheduler.FromCurrentSynchronizationContext();
        Task task = TaskEx.FromResult(false);
        var text = KeyAntigateTextBox.Text;
        for (var i=0; i<5; i++) {
            task = task.ContinueWith(_ => {
                var LikeTurbo = VK.NakrytkaLike(text);
                LikeTurbo.ContinueWith(_ => {
                     TextBox.Text += LikeTurbo.Result;
                }, scheduler);
                return LikeTurbo;
            }, TaskContinuationOptions.ExecuteSynchronously).Unwrap();
        }
    }
    
    ...
    
    public static class TaskEx {
        public static Task<T> FromResult<T> (T result) {
            var tcs = new TaskCompletionSource<T>();
            tcs.SetResult(result);
            return tcs.Task;
        }
    
        public static Task<T> Unwrap<T>(this Task<Task<T>> task) {
            var tcs = new TaskCompletionSource<T>();
            task.ContinueWith(_ => {
                if (task.IsCanceled) tcs.SetCancelled();
                else if (task.IsFaulted) tcs.SetException(task.Exception);
                else task.Result.ContinueWith(innerTask => {
                    if (innerTask.IsCanceled) tcs.SetCancelled();
                    else if (innerTask.IsFaulted) tcs.SetException(task.Exception);
                    else tcs.SetResult(innerTask.Result);
                }, TaskContinuationOptions.ExecuteSynchronously);
            }, TaskContinuationOptions.ExecuteSynchronously);
            return tcs.Task;
        }
    }


    Выглядит многословно, но на самом деле - ничего сложного. В цикле задачи ставятся в очередь одна за другой при помощи конструкции task = task.ContinueWith(...).Unwrap(). Здесь Unwrap() - это функция, позволяющая дождаться выполнения дочерней задачи, фактически простой распаковщик монады Task Task T -> Task T.

    Внутри такого цикла находится, фактически, старый код метода OnlyLike() - за тем исключением, что теперь он еще и возвращает ту задачу, которую создал (это нужно, чтобы дождаться ее выполнения). Здесь я позволил себе небольшое ускорение - поскольку я написал return LikeTurbo - каждая следующая итерация цикла будет ждать лишь предыдущей задачи VK.NakrytkaLike - но не будет ждать вывода на экран предыдущих результатов. Если важно именно дождаться вывода результатов - то надо возвращать не LikeTurbo, а результат ContinueWith.

    Также тут очень важно расположение вызова TaskScheduler.FromCurrentSynchronizationContext(); Поскольку в момент исполнения прошлой задачи мы можем находиться в любом контексте - то ориентироваться на текущий контекст нельзя. Нужный нам планировщик задач следует сохранить при входе в метод (на будущее: его нужно _всегда_ сохранять _только_ при входе в метод!)
    Ответ написан
  • Как построить блок-схему к этой программе?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    условия - ромбики, действия - квадратики. Цикл for - это квадратик в начале, потом ромбик, потом снова квадратик. По идее если у вас подряд идет несколько действий - можно объеденить их в одном квадратике. Соединяете стрелочками - готово.
    Ответ написан
    2 комментария