| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Как правильно писать программу |
| Автор: WantToProg 1.12.2009, 13:57 | ||
| Дело в том, что моя тема не просит ответить на вопрос, как сделать, чтоб работало. Все как ни странно работает. Основная проблема, это то, что я не знаю как правильно подойти к написанию программы. Где что определить, как к чему обращаться. Я прошу взглянуть на код написаный мной (не без помощи вас Итак, код:
Код требует серьезной доработки, как по работе с многопоточностью, так и обработкой выхода из потока(тоже кстати не знаю как сделать). Но основная проблема, как мне кажется, это некрасиво и не аккуратно написаный код. Я прошу посмотреть, и по возможности указать где, что и как нужно сделать. PS: Прошу прощения если разместил не там где нужно. Перенесите если не сложно в "Общие вопросы по .NET и C#" |
| Автор: LamerTM 2.12.2009, 12:39 |
| Если тебя интересует оформление кода, то это сюда: "Соглашения по оформлению кода команды RSDN" http://www.rsdn.ru/article/mag/200401/codestyle.XML |
| Автор: Экскалупатор 2.12.2009, 13:31 | ||||||
| WantToProg, такое ощущение, что это просто структурный код помещенный в оболочку формы и запускающийся по нажатию кнопки, да и даже для структурного он как то жестковат. static void Server(), я бы лично разделил штук на пять отдельных методов, а лучше в отдельном статическом классе реализовал. отдельные строки для меня вообще остаются загадкой:
зачем делать массив размером 1? если dtr это строка, и у тебя всегда один байт, может можно как то проще это сделать?
это вообще не айс. делает код еще больше запутанным. мало того что у тебя трех этажные циклы вложенные в друг друга, так еще и это. да и вообще просмотри хорошо свой код. например: для чего такое условие цикла?
Добавлено через 4 минуты и 6 секунд в общем в ответ на твой вопрос "как правильно писать программу" - это надо так сделать что бы человек(не комп, ему все равно, он поймет в любом случае, он же ее выполняет) мог прочитать твою программу и понять что в ней происходит. |
| Автор: Экскалупатор 2.12.2009, 15:17 |
| по организации кода можно почитать: Макконел "Совершенный код" Мартин Фаулер "Рефакторинг" |
| Автор: sergioK 15.1.2010, 15:27 |
| [QUOTE=WantToProg,2.12.2009, 14:50][QUOTE=LamerTM, Но программа написана исключительно криво, а как написать ее правильно, я не знаю :([/QUOTE] Когда то лет 10 назад один человек мне сказал - размер отдельной взятой функции не должен превышать размер экрана в котором она пишеться , начни с этого , ну и про goTo забудь, а вобще то этим вещам годами учаться |
| Автор: tol05 15.1.2010, 17:51 | ||
поддерживаю |
| Автор: kobra 16.1.2010, 01:17 | ||
вот тут есть две пути. 1. пишем так, как в вышеописанном коде, потом выносим в отделние модули то, что нужно вынести. 2. сначало продумываем все методы, пишем, а потом в основном методе их визываем. goto не самый лущи вариант выити из цикла, тем более что после этого опять заходит в тотже цикл. да и while (true) я бы заменил на рекурсию. |
| Автор: WolfTheGrey 16.1.2010, 08:42 |
| 1-старайся обьявлять переменные в начале класса. 2- нравится goto metka; - пользуйся. Тока в твоем коде я думаю что она слишком ранно стоит. при каждом переходе на метку вновь и вновь будет вызываться "listener.Start();" - зачем, ты же сервер? я бы метод пинга реализовал в новом потоке (чтоб не отвлекал). И смысл пинговать, когда при разъединении TCP вызывается на сервере ошибка Exeption, обработай его: закрой соедиение, удали пользователя... Добавлено через 12 минут и 51 секунду При UDP соединении можно пинговаьть, так как ни клиент о сервере и сервер о клиенте ни чего не знают. |
| Автор: CasperSC 19.1.2010, 17:02 | ||||||||
| Почитал тут и подумал: "Интересная темка"! Меня тоже этот вопрос интересует. Пишу программу и паралельно учу язык, так в ходе написания, я узнаю например, что для хранения настроек программы не обязательно использовать промежуточную структуру, хотя местами без этого ну ни как, например для отмены внесённых изменений в форме настроек, на забинденых контролах. Есть такой код и почему-то мне кажется тоже кривой до безобразия, щелчок по pictureBox играющему роль анимированой кнопки: Суть: при нажатии на кнопке или иконке в трее, если в настройка выбрано "Использовать анимированные показ и скрытие главного окна", то форма "уезжает" за панель задач. Иначе просто скрывается.
щелчок по значку в трее:
Прокоментируйте пожалуйста свои мысли. Мне кажется прячу и востанавливаю форму криво, что кривее некуда, может есть способ лучше? Особенно System.Threading.Thread.Sleep(10); и вообще весь цикл. Помоиму этот System.Threading.Thread.Sleep(10); тормозит всю программу. |
| Автор: Экскалупатор 19.1.2010, 17:48 | ||
зачем два раза проверять одно и тоже? иф не нужен совсем. |
| Автор: CasperSC 19.1.2010, 18:28 | ||||
Хм... даже не замечал этого. А то что криво написано я имел ввиду сам цикл и всё, что в нём. Может и не криво, просто других способов не видел. Через таймер было бы без System.Threading.Thread.Sleep(10); но не удобно. |
| Автор: Экскалупатор 19.1.2010, 20:59 |
| CasperSC, мне кажется лучше сделать один метод для скрытия(т.е. один для скрытия и один для раскрытия) формы. и что бы уже в методе решалось как именно прятать/открывать форму. т.е. что бы не в обработчике выбирался вариант скрытия, а именно сам метод решал. это уменьшило бы количество ифоф. |
| Автор: Exception 20.1.2010, 04:42 | ||
ДА! |
| Автор: WolfTheGrey 21.1.2010, 14:44 |
| System.Threading.Thread.Sleep(10) замени его на: System.Windows.Threading.DispatcharTimer он по лучше с формой себя ведет. Thread.sleep() он поток замораживает (форму) а DispatcharTimer тайминг отсчитывает. И почему не хочеш воспользоваться классами там всякими: AnimationDuration Добавлено через 1 минуту и 37 секунд А вобще мне понравился твой код, не заграмажденный. |