С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 15.08.2018
Сообщений: 127
1

Оптимизация кода

15.03.2019, 10:47. Показов 502. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, не знаю, по теме или нет, если нет - перенесите!
Хотел поинтересоваться у Вас насчет оптимизации данного кода, что тут неправильно, что слишком усложнено, как можно подправить? Подскажите, если Вас не затруднит (исходя из того, что это библиотека).
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
private const string __domain = "http://108.211.198.250/terro/main.php";
        private static long userID = 0;
        private static string userKey = "";
        private static bool isLogged = false;
 
        public static string Login(long id, string key)
        {
            XDocument userData = new XDocument();
            string responseStr = null;
            try
            {
                responseStr = Get(__domain, $"method=getInfo&user={id}&key={key}");
                userData = XDocument.Parse(responseStr);
                if(Convert.ToInt64(userData.XPathSelectElement("//rating")?.Value) > 1)
                {
                    responseStr = "Вы успешно авторизовались!";
                    userID = id; userKey = key; isLogged = true;
                }
                else
                {
                    responseStr = "Неверный логин или пароль!";
                }
            }
            catch(Exception)
            {
                return "Неизвестная ошибка при авторизации! #520"; // тут, либо xmlException проскакивает, либо WebRequest, проверять отдельно каждое не стал, хотя, можно
            }
            return responseStr;
        }
 
        public static (int ID, string mode, short snglMode, long fullHP, 
            long currentHP, long fullTime, long startTime) GetBattleInfo()
        {
            var emptyData = (ID: 0, mode: "n/d", snglMode: Convert.ToInt16(0), fullHP: 0, currentHP: 0, fullTime: 0, startTime: 0);
            if (isLogged == false) return emptyData;
            string responseStr = Get(__domain, $"method=getBattle&user={userID}&key={userKey}");
            XDocument battleData = XDocument.Parse(responseStr);
            if (battleData.XPathSelectElement("//screen")?.Value == "boss") return emptyData;
            var bossInfo = (ID:Convert.ToInt32(battleData.XPathSelectElement("//id").Value),
                            mode:battleData.XPathSelectElement("//mode")?.Value,
                            snglMode:Convert.ToInt16(battleData.XPathSelectElement("//sngl").Value),
                            fullHP:Convert.ToInt64(battleData.XPathSelectElement("//h_full").Value),
                            currentHP:Convert.ToInt64(battleData.XPathSelectElement("//h_now").Value),
                            fullTime:Convert.ToInt64(battleData.XPathSelectElement("//battle_time").Value),
                            startTime:Convert.ToInt64(battleData.XPathSelectElement("//start_ts").Value)); // тут, не совсем уверен, что юзать кортеж, в данном случае, это есть - хорошо
            return bossInfo;
        }
 
        private static string Get(string Url, string Data)
        {
            System.Net.WebRequest req = System.Net.WebRequest.Create(Url + "?" + Data);
            System.Net.WebResponse resp = req.GetResponse();
            System.IO.Stream stream = resp.GetResponseStream();
            System.IO.StreamReader sr = new System.IO.StreamReader(stream);
            string Out = sr.ReadToEnd();
            sr.Close();
            return Out;
        }
Спасибо заранее!

Добавлено через 1 час 28 минут
up.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.03.2019, 10:47
Ответы с готовыми решениями:

Оптимизация кода
Console.WriteLine("Нажми Enter для старта..."); // баги: 1. после вывода примера если нажать enter...

Оптимизация кода
Возможно ли заменить быдло-код проверки - пуста ли строка и появления картинки возле неё? ...

Оптимизация кода
Есть кусок кода: public static void NOCH (object source, ElapsedEventArgs e) { ...

Оптимизация кода
Здравствуйте. Имею такую задачу: проходиться по коллекции файлов, и проводить фильтр по...

4
Эксперт .NETАвтор FAQ
10418 / 5148 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
15.03.2019, 11:59 2
Цитата Сообщение от W1nStoN Посмотреть сообщение
что тут неправильно
Почти все.

Ну например, почему у вас сервисный класс возвращает строку из метода Login?
Как внешнему коду узнать залогинен юзер или нет?
Парсить вашу строку? И писать код типа:
C#
1
2
if (Login() == "Вы успешно авторизовались!")
   DoSomething();
Да?

А если завтра вы захотите мультиязычный интерфейс, что вы будете делать?

Метод Login должен возвращать либо bool (в простейшем случае), либо какой-то UserInfo. Но уж строку я никак не ожидаю получить от метода Login.

Ну и еще куча всего - зашитые хардкодом URL-ы и имена полей, полное отсутствие using, непонятно зачем прилепленные кортежи, вместо нормального класса.
1
1 / 1 / 0
Регистрация: 15.08.2018
Сообщений: 127
15.03.2019, 12:14  [ТС] 3
Storm23, благодарю, изначально Login возвращал bool. Но об этом я не подумал
Цитата Сообщение от Storm23 Посмотреть сообщение
Как внешнему коду узнать залогинен юзер или нет?
Парсить вашу строку? И писать код типа:
Я не думал, что во внешнем коде будет проверка на авторизацию. Авторизация проходит и я могу использовать остальные методы, т.к во всех них присутствует проверка на авторизацию... Хотя, да, костыльно...

Добавлено через 4 минуты
Storm23, ах да, будьте добры, подскажите насчет Using, где использовать? И, как я понял, глупо делать html константой, лучше прописывать при каждом вызове get?
0
Эксперт .NETАвтор FAQ
10418 / 5148 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
15.03.2019, 12:29 4
Цитата Сообщение от W1nStoN Посмотреть сообщение
подскажите насчет Using, где использовать?
Все объекты, которые реализуют интерфейс IDisposable должны либо использоваться через using, либо у них нужно явно вызывать метод Dispose.
Все эти классы: WebResponse, Stream, StreamReader - они все реализуют IDisposable, и должны оборачиваться в using.
Представьте себе ситуацию, что в методе Get сервер не отвечает и в строке resp.GetResponseStream(); вылетает исключение. При этом WebResponse остается открытым, как следствие - утечка памяти.

Цитата Сообщение от W1nStoN Посмотреть сообщение
как я понял, глупо делать html константой, лучше прописывать при каждом вызове get
Я не очень понял о каком HTML вы говорите. Это у вас сервер присылает ответ в виде HTML что ли?
Это ненормально в принципе. Он должен присылать типа json или xml. А на стороне клиента нужно просто делать json или XML десериализацию в класс. Тогда весь вот этот паравоз с парсингом HTML уйдет.

А еще меня немного смущает что вы делаете парсинг чисел, полученных от сервера в текущей культуре. Нужно явно использовать CultureInfo.InvariantCulture. Иначе будут потенциальные проблемы.
0
1 / 1 / 0
Регистрация: 15.08.2018
Сообщений: 127
15.03.2019, 12:43  [ТС] 5
Storm23, сервер присылает xml, с которым я и работаю. Я прочитал Ваш предыдущий комментарий, где Вы сказали: "зашитые хардкодом URL-ы и имена полей", и подумал о поле __domain в котором хранится, адрес. Насчет
Цитата Сообщение от W1nStoN Посмотреть сообщение
И, как я понял, глупо делать html константой, лучше прописывать при каждом вызове get?
я вместо http написал html, и сбил Вас с толку, простите за опечатку.
За объяснение про Using - огромное спасибо, буду исправлять сие "...", что я выложил сюда. Хотелось бы, послушать Ваше мнение об исправленном коде, если я могу на это рассчитывать. (Но это уже потом)
Цитата Сообщение от Storm23 Посмотреть сообщение
А еще меня немного смущает что вы делаете парсинг чисел, полученных от сервера в текущей культуре. Нужно явно использовать CultureInfo.InvariantCulture. Иначе будут потенциальные проблемы.
Насчет этого, я не понял, но буду разбираться.
0
15.03.2019, 12:43
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.03.2019, 12:43
Помогаю со студенческими работами здесь

Оптимизация кода
Добрый вечер, господа! В данный момент я пишу тулзу для демонстрации алгоритмов оценки движения и...

Оптимизация кода
Добрый день! Может ли кто-нибудь подсказать, возможна ли оптимизация (сокращения строк, без...

Оптимизация кода
Описание задачи: В доме живет N жильцов. Однажды решили провести перепись всех жильцов данного...

Оптимизация кода
Доброго времени суток. Прошу прощения, если буду ошибаться в терминах, но постараюсь правильно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Что такое HCL Notes и как с ним работать
InfoMaster 10.01.2025
HCL Notes (ранее известный как IBM Notes и Lotus Notes) представляет собой комплексную платформу для совместной работы и обмена информацией в корпоративной среде. Это многофункциональное решение,. . .
Как работать с Git из Windows и Visual Studio
InfoMaster 10.01.2025
Работа с Git в Windows Работа с Git в операционной системе Windows может быть осуществлена с помощью различных инструментов, каждый из которых обладает своими уникальными возможностями и. . .
Аналог оператора switch case в Python
InfoMaster 10.01.2025
Оператор switch case используется в программировании для выбора одного из нескольких вариантов исполнения кода. Однако в языке Python этот оператор отсутствует. Понимание аналогов switch case в. . .
Отличия абстрактного класса от интерфейса
InfoMaster 10.01.2025
В современной разработке программного обеспечения существуют два основных механизма реализации абстракции: абстрактные классы и интерфейсы. Эти инструменты, хотя и схожи в своей основной цели -. . .
Как работать в Git
InfoMaster 10.01.2025
Git — это одна из наиболее популярных систем контроля версий, которая активно используется разработчиками по всему миру. Она позволяет эффективно управлять изменениями в коде, координировать работу. . .
Реализация передвижения персонажа в Unity3d на C#
InfoMaster 10.01.2025
Реализация передвижения персонажа в Unity3D начинается с правильной настройки проекта. Этот этап критически важен для создания отзывчивого и плавного управления. Рассмотрим основные шаги для создания. . .
Docker: руководство для начинающих
InfoMaster 10.01.2025
В современном мире разработки программного обеспечения контейнеризация стала неотъемлемой частью процесса создания и развертывания приложений. Docker, как ведущая платформа контейнеризации, произвела. . .
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru