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

Разобрать пример кода C#

08.01.2020, 03:59. Показов 2853. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте дорогие форумчане! С Рождеством Христовым Вас всех! И с Новым годом! Гармонии Вам и Вашему дому, и счастья в новом году!
Однако к делу. Некоторое время назад, я понял, что мне придётся осваивать язык программирования C# Есть одно приложение, в котором он применяется, с целью расширения его функций и выполнения определённых задач. И мне нужно будет пользоваться этим приложением. Опыта программирования у меня почти нет, если не считать попытки написать сайт на PHP, чтения толстой книги по Си++, с последующим пониманием, что писать на этом языке я не стану, и несколько удачных попыток в скрипто-писании. То есть, я очень очень новичок.
У меня есть кусок кода, который мне необходимо разобрать, что бы лучше понять, алгоритм написания программ на С#. Да и понять хочется, как работает эта программа. То есть, что она делает я знаю. Она просто отправляет запросы в онлайн переводчик и получает ответы. Но мне нужно понять, что именно она делает в каждой строке кода. В конечном итоге я хотел бы иметь полное представление, как происходит взаимодействие с этим онлайн-сервисом, что бы суметь написать что то похожее.
Просьба к участникам форума: Прокомментируйте пожалуйста построчно этот кусок кода, подробно объяснив, что делает каждая его строчка. Такой пример будет наглядным пособием для любого начинающего программиста, пришедшего в данный раздел форума. А вот и сам код:
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// This is an open source non-commercial project. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++, C#, and Java: http://www.viva64.com
 
using Newtonsoft.Json;
using System;
 
namespace Translation.Deepl
{
    class DeepLTranslator
    {
        int _DeepLId;
 
        Random Rnd;
 
        WebApi.DeepLWebReader DeeplWebReader;
 
        bool _IsFirstTime;
 
        bool _ServerSplit;
 
        ILog _Logger;
 
        public DeepLTranslator(ILog logger)
        {
            _Logger = logger;
 
            DeeplWebReader = new WebApi.DeepLWebReader(_Logger);
 
            Rnd = new Random(DateTime.Now.Millisecond);
 
            _DeepLId = Rnd.Next(33931525, 53931525);
 
            _IsFirstTime = true;
 
            _ServerSplit = false;
        }
 
        public string Translate(string sentence, string inLang, string outLang)
        {
            string result = String.Empty;
 
            if (inLang == outLang)
                return sentence;
 
            try
            {
                string _outLang = outLang;
                string _inLang = inLang;
 
                if (_DeepLId > 83931525)
                {
                    _DeepLId = Rnd.Next(33931525, 53931525);
                    DeeplWebReader = new WebApi.DeepLWebReader(_Logger);
 
                    _IsFirstTime = true;
                }
 
                if (_IsFirstTime)
                {
                    _IsFirstTime = false;
 
                    DeepLRequest.DeepLHandshakeRequest deepLHandshakeRequest = new DeepLRequest.DeepLHandshakeRequest(_DeepLId);
 
                    string handShakeUrl = @"https://www.deepl.com/PHP/backend/clientState.php?request_type=jsonrpc&il=RU";
                    string strDeepLHandshakeRequest = JsonConvert.SerializeObject(deepLHandshakeRequest);
 
                    var strDeepLHandshakeResp = DeeplWebReader.GetWebData(handShakeUrl, WebApi.WebReader.WebMethods.POST, strDeepLHandshakeRequest);
                    var DeepLHandshakeResp = JsonConvert.DeserializeObject<DeepLResponse.DeepLHandshakeResponse>(strDeepLHandshakeResp);
 
                    _Logger?.WriteLog(strDeepLHandshakeResp);
 
                    _DeepLId++;
 
                    _IsFirstTime = false;
                }
 
                string url = @"https://www2.deepl.com/jsonrpc";
 
                if (_ServerSplit || inLang == "auto")
                {
                    DeepLRequest.DeepLCookieRequest deepLSentenceRequest = new DeepLRequest.DeepLCookieRequest(_DeepLId, sentence);
                    string strDeepLsentenceRequest = deepLSentenceRequest.ToJsonString();
 
                    var strDeepLSentencetResp = DeeplWebReader.GetWebData(url, WebApi.WebReader.WebMethods.POST, strDeepLsentenceRequest);
                    var deepLSentenceResp = JsonConvert.DeserializeObject<DeepLResponse.DeepLSentencePreprocessResponse>(strDeepLSentencetResp);
 
                    _DeepLId++;
 
                    inLang = deepLSentenceResp.result.lang;
                    if (inLang.Length == 0)
                        return result;
                }
 
                DeepLRequest.DeepLTranslatorRequest deepLTranslationRequest = new DeepLRequest.DeepLTranslatorRequest(_DeepLId, sentence, inLang, outLang);
                string strDeepLTranslationRequest = deepLTranslationRequest.ToJsonString();
 
                var strDeepLTranslationResponse = DeeplWebReader.GetWebData(url, WebApi.WebReader.WebMethods.POST, strDeepLTranslationRequest);
                _DeepLId++;
 
                var DeepLTranslationResponse = JsonConvert.DeserializeObject<DeepLResponse.DeepLTranslationResponse>(strDeepLTranslationResponse);
 
                string temporaryResult = String.Empty;
                if (DeepLTranslationResponse != null)
                {
                    var translations = DeepLTranslationResponse.result.translations;
                    for (int i = 0; i < translations.Count; i++)
                    {
                        if (translations[i].beams.Count > 0)
                            temporaryResult += " " + translations[i].beams[0].postprocessed_sentence;
                    }
                }
 
                result = temporaryResult;
 
            }
            catch (Exception e)
            {
                _Logger?.WriteLog(Convert.ToString(e));
            }
 
            return result;
        }
    }
}
Заранее благодарен всем откликнувшимся
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2020, 03:59
Ответы с готовыми решениями:

Перегрузка методов - разобрать пример кода
Вечер добрый. Есть классы: class Cl1 { public virtual void Fooo(int x) ...

IDisposable для пользовательских классов. Разобрать пример кода
Есть некий объект, одно поле которого - это класс-наследник IDisposable. Соответственно, данный...

Разобрать пример наследования
Вопрос по наследованию: допустип есть базовый класс А; есть производный от класса А класс Б; и...

Не могу разобрать пример в книге
Доброго времени суток.Начал изучение С# по &quot;Шилдт Г. полное руководство C#&quot;.Дошел до 200...

13
352 / 247 / 76
Регистрация: 18.03.2016
Сообщений: 979
08.01.2020, 04:35 2
Камил-Отто,

Не по теме:

после

Цитата Сообщение от Камил-Отто Посмотреть сообщение
Однако к делу.
я перестал читать)

0
1 / 1 / 0
Регистрация: 29.06.2016
Сообщений: 15
09.01.2020, 00:59  [ТС] 3
jester,
я перестал читать)
О-о! Многобукав? Понимаю. А вы с перекурами. Не сдавайтесь. Я в вас верю! Может и по существу ответить повезёт.
0
1842 / 1184 / 501
Регистрация: 14.10.2018
Сообщений: 3,180
09.01.2020, 01:17 4
Цитата Сообщение от Камил-Отто Посмотреть сообщение
Такой пример будет наглядным пособием для любого начинающего программиста
Для кого кого, а точно не начинающего. Проблема в том, что здесь используется библиотека, неизвестная даже Reference Source. Связывайтесь с создателем этих строк
C#
1
using Newtonsoft.Json;
Он вам сможет рассказать как работают его классы.

Не по теме:

Вы из Тулы?

1
352 / 247 / 76
Регистрация: 18.03.2016
Сообщений: 979
09.01.2020, 01:30 5
Камил-Отто,

Не по теме:

не курю(


Не по теме:

если ты из Тулы, то я согласен прочитать твои буквы за 10 тульских пряников

0
1 / 1 / 0
Регистрация: 29.06.2016
Сообщений: 15
09.01.2020, 03:21  [ТС] 6
Цитата Сообщение от Enifan Посмотреть сообщение
1
using Newtonsoft.Json;
А вот и первые капли адекватности на этом уважаемом форуме. Спасибо Enifan! Вы подсказали, что ещё придётся прояснить. Я уже нашёл информацию об этой библиотеке. И, если вам не очень трудно, прокомментируйте пожалуйста те строчки кода, которые не вызывают у вас сомнения. Этим вы сильно поможете в разборе кода.

Добавлено через 2 минуты
Цитата Сообщение от jester Посмотреть сообщение
если ты из Тулы, то я согласен прочитать твои буквы за 10 тульских пряников
О-о! Не стоит напрягать свой могучий МОСК из-за такой мелочи. Лучше поберегите зубы.
0
Yury Komar
09.01.2020, 04:30
  #7
 Комментарий модератора 
Не разжигайте конфликтов.
Если нечего сказать по теме вопроса ТС, то просто пройдите мимо.
0
Wanna be serious
586 / 473 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
09.01.2020, 05:29 8
Лучший ответ Сообщение было отмечено Камил-Отто как решение

Решение

Чтож, попробую Вам помочь:
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// This is an open source non-commercial project. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++, C#, and Java: http://www.viva64.com
 
// Как сказали выше, это библиотека позволяющая работать с JSON строками.
// О них можете прочитать здесь: https://ru.wikipedia.org/wiki/JSON
using Newtonsoft.Json;
// Здесь я думаю Вам понятно: базовая библиотека, содержащая большинство необходимых сборок
using System;
 
// Если изучали C++, то должны были столкнуться с понятием пространства имён.
// В C# принято всё помещать в namespace'ы
namespace Translation.Deepl
{
    class DeepLTranslator
    {
        // Я так понимаю числовое значение идентификатора
        int _DeepLId;
        // Random - класс, экземпляр которого позволяет генерировать случайные значения
        Random Rnd;
        // Я так понимаю, это класс позволяющий обращаться к веб сервисам из приложения
        WebApi.DeepLWebReader DeeplWebReader;
        // Поля, хранящие булевы значения: true/false. Судя по названию, первое это является ли в первый раз (что бы это ни было :) )
        bool _IsFirstTime;
 
        bool _ServerSplit;
        // Экземпляр логгера, позволяющего производить записи в файлы в процессе выполнения программы
        ILog _Logger;
        // Конструктор, в котором происходит инициализация базовых полей класса
        public DeepLTranslator(ILog logger)
        {
            _Logger = logger;
            // Создание нового экземпляра класса, с передачей в качестве аргумента логгера
            DeeplWebReader = new WebApi.DeepLWebReader(_Logger);
            // Инициализация текущим значением времени в миллисекундах экземпляра класса рандома
            Rnd = new Random(DateTime.Now.Millisecond);
            // Присвоение рандомного значения идентификатору.
            // Так делать не стоит, не понятно что за числа используются при генерации
            _DeepLId = Rnd.Next(33931525, 53931525);
 
            _IsFirstTime = true;
 
            _ServerSplit = false;
        }
        // Метод в котором происходит общение с сервером
        public string Translate(string sentence, string inLang, string outLang)
        {
            string result = String.Empty;
            // На сколько я понял, если язык оригинала и язык перевода совпадают - вернуть переводимое предложение
            if (inLang == outLang)
                return sentence;
            // Конструкция try/catch - для отлова исключений генерируемых в случае ошибок в процессе выполнения кода
            try
            {
                string _outLang = outLang;
                string _inLang = inLang;
                // Сравние идентификатора с "магическим" числом.
                // Опять так, так делать не стоит, не понятно что за число и почему именно оно
                if (_DeepLId > 83931525)
                {
                    // Генерация нового значения идентификатора
                    _DeepLId = Rnd.Next(33931525, 53931525);
                    // Создание нового экземпляра класса запросов к серверу
                    DeeplWebReader = new WebApi.DeepLWebReader(_Logger);
 
                    _IsFirstTime = true;
                }
                // Участок кода, если исполнение происходит в первый раз
                if (_IsFirstTime)
                {
                    // Указание о том, что выполнение в следующий раз будет происходить не первый раз
                    _IsFirstTime = false;
                    // Создание экземпляра запросчика
                    DeepLRequest.DeepLHandshakeRequest deepLHandshakeRequest = new DeepLRequest.DeepLHandshakeRequest(_DeepLId);
                    // URL, к которому будет происходить обращение
                    string handShakeUrl = @"https://www.deepl.com/PHP/backend/clientState.php?request_type=jsonrpc&il=RU";
                    // Конвертирование строки запроса в формат JSON
                    string strDeepLHandshakeRequest = JsonConvert.SerializeObject(deepLHandshakeRequest);
                    // Получение ответа от сервера, путем обращения по URL указанному выше, методом POST, с отправкой JSON строки полученной выше
                    var strDeepLHandshakeResp = DeeplWebReader.GetWebData(handShakeUrl, WebApi.WebReader.WebMethods.POST, strDeepLHandshakeRequest);
                    // Десериализация ответа из JSON строки в объект типа DeepLResponse.DeepLHandshakeResponse
                    var DeepLHandshakeResp = JsonConvert.DeserializeObject<DeepLResponse.DeepLHandshakeResponse>(strDeepLHandshakeResp);
                    // Запись в лог информации с полученным ответом от сервера. ?. - это предохранение, в случае если _Logger null, не будет сгенерировано исключение NullReferenceException
                    _Logger?.WriteLog(strDeepLHandshakeResp);
                    // Инкрементация значения идентификатора
                    _DeepLId++;
 
                    _IsFirstTime = false;
                }
                // Дальше всё примерно тоже самое что и выше, в комментировании не нуждается
                string url = @"https://www2.deepl.com/jsonrpc";
 
                if (_ServerSplit || inLang == "auto")
                {
                    DeepLRequest.DeepLCookieRequest deepLSentenceRequest = new DeepLRequest.DeepLCookieRequest(_DeepLId, sentence);
                    string strDeepLsentenceRequest = deepLSentenceRequest.ToJsonString();
 
                    var strDeepLSentencetResp = DeeplWebReader.GetWebData(url, WebApi.WebReader.WebMethods.POST, strDeepLsentenceRequest);
                    var deepLSentenceResp = JsonConvert.DeserializeObject<DeepLResponse.DeepLSentencePreprocessResponse>(strDeepLSentencetResp);
 
                    _DeepLId++;
 
                    inLang = deepLSentenceResp.result.lang;
                    if (inLang.Length == 0)
                        return result;
                }
 
                DeepLRequest.DeepLTranslatorRequest deepLTranslationRequest = new DeepLRequest.DeepLTranslatorRequest(_DeepLId, sentence, inLang, outLang);
                string strDeepLTranslationRequest = deepLTranslationRequest.ToJsonString();
 
                var strDeepLTranslationResponse = DeeplWebReader.GetWebData(url, WebApi.WebReader.WebMethods.POST, strDeepLTranslationRequest);
                _DeepLId++;
 
                var DeepLTranslationResponse = JsonConvert.DeserializeObject<DeepLResponse.DeepLTranslationResponse>(strDeepLTranslationResponse);
 
                string temporaryResult = String.Empty;
                if (DeepLTranslationResponse != null)
                {
                    var translations = DeepLTranslationResponse.result.translations;
                    for (int i = 0; i < translations.Count; i++)
                    {
                        if (translations[i].beams.Count > 0)
                            temporaryResult += " " + translations[i].beams[0].postprocessed_sentence;
                    }
                }
 
                result = temporaryResult;
 
            }
            // Если выше было сгенерировано исключение, управление будет передано catch для обработки ошибки
            catch (Exception e)
            {
                _Logger?.WriteLog(Convert.ToString(e));
            }
            // Возвращение строки содержащей результат запросов
            return result;
        }
    }
}
2
626 / 390 / 135
Регистрация: 06.03.2017
Сообщений: 1,457
09.01.2020, 13:34 9
Цитата Сообщение от Камил-Отто Посмотреть сообщение
Лучше поберегите зубы.
Звучит как угроза
0
692 / 509 / 238
Регистрация: 02.10.2012
Сообщений: 1,741
09.01.2020, 13:40 10
Цитата Сообщение от Enifan Посмотреть сообщение
Проблема в том, что здесь используется библиотека, неизвестная даже Reference Source. Связывайтесь с создателем этих строк
серьезно? а какая по вашему мнению самая популярная библиотека для работы с json?
0
1842 / 1184 / 501
Регистрация: 14.10.2018
Сообщений: 3,180
09.01.2020, 15:06 11
Цитата Сообщение от Immo Посмотреть сообщение
какая по вашему мнению самая популярная библиотека для работы с json?
Без понятия, с JSON не работал еще. Если брать Метанит или Документацию, то в обоих случаях идет упоминание о
C#
1
2
using System.Text.Json;
using System.Text.Json.Serialization;
Однако у нас
C#
1
using Newtonsoft.Json;
Конечно гугл выдает ответы по данной библиотеке и есть даже упоминания о том что она является удобной, но откуда она взялась, каковы ее методы и как они работают. Да есть и github где можно это посмотреть. Однако почему такая популярная библиотека не имеет какого то "официального" статуса в известных источниках. Может быть я чего то не понимаю (не отрицаю того что я далеко не спец-кодер), но все же для меня это "дико и странно".
0
2806 / 1676 / 884
Регистрация: 14.04.2015
Сообщений: 5,717
09.01.2020, 15:35 12
Enifan,
Цитата Сообщение от Enifan Посмотреть сообщение
Однако почему такая популярная библиотека не имеет какого то "официального" статуса в известных источниках. Может быть я чего то не понимаю (не отрицаю того что я далеко не спец-кодер), но все же для меня это "дико и странно".
А чем Git не официальный источник?
Чтобы оценить популярность пакета, достаточно сделать 3 простых шага:
1) Зайти в Диспетчер NuGet
2) ввести в поиск Json
3) посмотреть на количество скачиваний
2
1 / 1 / 0
Регистрация: 29.06.2016
Сообщений: 15
09.01.2020, 19:38  [ТС] 13
Bespridelschic, Спасибо вам большое! Вы действительно облегчили понимание кода. Однако, в не комментированной части есть то, что меня смущает. Я раньше никогда не работал с запросами. Вот тут что то про куки. Может всё таки ещё и этот кусок прокомментируете?
C#
1
2
3
4
5
6
7
                // Дальше всё примерно тоже самое что и выше, в комментировании не нуждается
                string url = @"https://www2.deepl.com/jsonrpc";
 
                if (_ServerSplit || inLang == "auto")
                {
                    DeepLRequest.DeepLCookieRequest deepLSentenceRequest = new DeepLRequest.DeepLCookieRequest(_DeepLId, sentence);
                    string strDeepLsentenceRequest = deepLSentenceRequest.ToJsonString();
После этого, я хотел бы уточнить, ещё несколько моментов.

Добавлено через 4 минуты
Цитата Сообщение от Pilarentes Посмотреть сообщение
Звучит как угроза
А так и есть. Тульские пряники содержат столько экстракта солодки, что это угроза даже здоровым зубам. А если там хоть какой то намёк на деструкцию эмали... После десятого пряника может испортиться характер и сладкоежку начнут бить окружающие. Это и правда опасно.
1
Wanna be serious
586 / 473 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
14.01.2020, 15:20 14
Камил-Отто, в данном случае, если сервер "разделён" или язык предложения является
автоматически определяемым, то в куки запроса зашивается идентификатор и предложение для
перевода. Далее, эта строка переводится в формат JSON и отправляется на сервер.

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

Цитата Сообщение от Камил-Отто Посмотреть сообщение
После этого, я хотел бы уточнить, ещё несколько моментов.
Задавайте любые вопросы, для этого мы здесь и собрались
0
14.01.2020, 15:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2020, 15:20
Помогаю со студенческими работами здесь

Перегрузка метода - разобрать пример
Привет всем , увидел такую конструкцию и не совсем понял для чего она. Есть метод , допусти People...

Разобрать пример с Array.Sort()
Здравствуйте! не могу понять как так получается что строка sr1.Sort(ref db_arr); возвращает...

Делегаты, разобрать простой пример
Добрый день. Почему выводит на экран только: &quot;2&quot;? Я ожидал увидеть: &quot;12&quot; delegate int MyDel();...

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru