Автор будет очень признателен, если Вы кликнете по одной из белых ссылок выше.
Вам это ничего не стоит, а автору сайта будет приятно ;)
Найдено страниц: 38 [показано 10]
Залепа №13. О грамотном проектировании и неграмотном IDE.
Степень соответствия запросу: 73,89%
Фрагменты текста поста : ... такое решение, при котором наша программа не превратится в кашу из кучи классов, лишних открытых методов, свойств и форм... ... Здравый смысл подсказывает, что справочник должен быть представлен неким классом (назовем его CUserMgr ), который позволяет основной программе получить все необходимые данные о пользователе и скрывает всю внутреннюю структуру внутри себя... ... Опять же для простоты решим, что программе нужно получать только лишь логин и пароль пользователя по его идентификатору... ... Таким образом у нас получается примерно такой открытый интерфейс нашего класса: Набросок класса public class CUserMgr { // получить идентификатор по логину public int GetID(string login) {... ... } // получить логин по идентификатору public string GetLogin(int id) {... ... } // получить пароль по идентификатору public string GetPassword(int id) {... ... } // вызвать редактор пользователей public void ShowEditor() {... ... } } Так же класс должен содержать еще набор закрытых методов для редактирования пользователей: добавление нового пользователя, удаление существующего, изменение параметров пользователя, загрузку и сохранение списка пользователей и т... ... Итак, получаем как минимум две формы, которые должны напрямую обращаться к внутренней структуре класса CUserMgr , т... ... Чтобы формы могли обратиться к внутренней структуре класса CUserMgr придется внутреннюю структуру сделать открытой, т... ... Открытая структура класса менеджера приводит к путанице и соблазну использовать эти методы (которые по логике должны быть закрытыми) не по назначению... ... Все это можно перетерпеть если вы создаете класс, который будет использоваться только в вашей программе и код которого никогда не будет использован где-либо еще... ... Вариант номер раз (стиль программирования a'la Microsoft) Суть заключается в избавлении от необходимости использовать одним классом внутренней структуры другого класса... ... Решение сводится к созданию классов, представляющих сущности используя в качестве базы класс формы... ... Нам необходимо создать отдельный класс, представляющий собой запись из БД (информацию об отдельном пользователе)... ... Причем этот класс должен быть порожден от класса Form , чтобы он мог отобразить себя для редактирования данных пользователя... ... Набросаем примерную структуру: Набросок класса записи public class CUser : Form { private string Login... ... // конструктор public CUser(int id, string login, string passw) {... ... } public string GetLogin() { return Login... ... } public string GetPassword() { return Password... ... } public int GetID() { return ID... ... } // вызов редактора пользователя public void Edit() {... ... } // загрузка и сохранение данных о пользователе public bool Load() {... ... } public bool Save() {... ... Теперь нашему окну редактирования пользователя (классу CUser ) уже не нужно обращаться к классу CUserMgr за информацией - все необходимое он содержит в себе... ... Наш класс менеджера также должен быть наследником класса формы ( Form )... ... список пользователей (объектов класса CUser ) он содержит внутри себя... ... Он их будет создавать и удалять (редактирование списка пользователей), получать из них информацию и передавать ее в основную программу... ... Класс CUser все еще глобален и видим любым и каждым со всеми вытекающими отсюда отрицательными последствиями... ... Вариант номер два (реально объектно-ориентированный) Второй вариант использует возможность C# создавать вложенные классы... ... В C# введена возможность определить класс внутри другого класса... ... При этом встроенный класс получает статус "члена класса-оболочки", т... ... все объекты вложенного класса (кем бы и где бы они не были созданы) имеют ПОЛНЫЙ доступ к членам своего класса-оболочки: они могут использовать и защищенные и даже закрытые методы класса-оболочки... ... А примерно вот так: Объектно-ориентированное (правильное) решение public class CUserMgr { class CUser { private string Login... ... } class CUserEdit : Form { public void Edit()... ... } class CUserList : Form { public void ShowList() {... ... // "внешний интерфейс" public bool Load() {... ... } public bool Save() {... ... } public void ShowEditor() {... ... } } Итак, вот что мы получаем при таком подходе: программа "видит" только класс CUserMgr , о существовании внутренних классов она даже не подозревает и естественно не может получить к ним доступ... ... Она может использовать только открытый "внешний интерфейс" класса CUserMgr... ... Если внешний интерфейс не изменится, то эти модификации никак не скажутся на работе основной программы, использующей наш класс... ... Встроенные классы могут без проблем обращаться к внутренним (закрытым) методам класса CUserMgr , что позволяет в ряде случаев сильно упростить программирование этих классов... ... Классы, созданные по описанной выше "технологии" будут нормально компилироваться и работать (а как же иначе - все ведь сделано верно, в соответствии с требованиями и возможностями языка C#)... ... Но в IDE вы не сможете использовать визуальный редактор для форм, которые являются вложенными в другие классы (в нашем случае это CUserEdit и CUserList ) - IDE вместо отображения формы просто будет материться по-английски... Подробнее: http://fit-media.com/post_1204892317.htmlЗалепа №9. Microsoft друзей не признает.
Степень соответствия запросу: 19,73%
Фрагменты текста поста : ... Определение класса "календарь" можно было бы даже вложить в определение класса "дата"... ... Другими словами, правильное проектирование в ООП - это создание классов, АБСОЛЮТНО НЕЗАВИСИМЫХ от других классов и объектов, инкапсулирующих все необходимые для работы классы внутри себя... ... // инициализировали другим объектом класса CData (присваивание) cd... ... Естественно, класс CDate должен быть порожден от System... ... Итак, упростим задачу до предела: есть класс CDate , представляющий ни что иное как обычную календарную дату... ... есть класс CCalendar , представляющий собой вспомогательное окно, отображающее календарь и принимающее ввод от юзера... ... Требования к реализации: 1) все операции касающиеся даты, должны выполняться в классе CDate... ... 2) класс календаря, фактически являясь окном, имеет только "оконную" функциональность... ... пользователь нашего класса CDate НЕ должен иметь доступ к функциям внутренней обработки... ... Для него предоставлен интерфейс взаимодействия в виде открытых свойств и методов, им пусть и пользуется... ... Отсюда вытекают пункты: 3а) класс календаря не должен быть виден пользователю... ... 3б) проект должен иметь некую "модульную" структуру, чтобы встраивание класса CDate в реальную программу было максимально простым... ... Из третьего пункта следует, что объекты класса CCalendar будут создаваться не пользователем, а только классом CDate , им же они будут контролироваться в течении всей жизни календаря и, в конце-концов, он же их будет и уничтожать... ... :( В C++ мы бы просто сделали класс CCalendar другом класса CDate , разрешив тем самым календарю использовать внутренние механизмы в виде вызовов защищенных методов CDate... ... Согласен, решение не самое элегантное, но, поскольку оба класса разрабатываются нами, а пользователи о таком "разделении труда" даже не подозревают (и соответственно не смогут, например, породить наследников от календаря), то такое решение вполне приемлемо... ... Подозреваю, что именно поэтому классы... ... NET набиты таким большим количеством лишних методов и обработчиков - мелкомягкие вступили в собственную ловушку... ... Чем грозит такое "открытие внутренней функциональности" наверное объяснять не нужно: вот есть класс, вот его методы, причем ОТКРЫТЫЕ методы, но пользоваться ими нельзя, т... ... А именно, если распространять свой класс CDate в виде исходников, то он потянет за собой и класс CCalendar , а мы бы не хотели, чтобы пользователь знал о нем... ... Если же скомпоновать наш класс в сборку (assembly), то класс календаря можно сделать ненаследуемым, но при таком подходе пользователю уже не удастся сделать программу из одного exe-файла - придется тягать за собой еще и нашу сборку... Подробнее: http://fit-media.com/post_1199568462.htmlAJAX — WEB 2.0 за 5 минут
Степень соответствия запросу: 1,32%
Фрагменты текста поста : ... ) идентификатор или имя класса в формате CSS... ... Функция $('#my_container') вернет объект jQuery, который имеет массу методов, выполняющих самые разные действия... ... Но, поскольку нас интересует загрузка содержимого в наш контейнер, то мы воспользуемся методом load()... ... Ему в качестве параметра передается URL, с которого необходимо получить данные... ... Гораздо чаще встречается ситуация, когда нужно отправить серверу какие-то данные и получить ответ, который, затем необходимо всунуть в контейнер... ... Решается эта задача так же просто, но сперва давайте создадим серверный скрипт, который будет получать данные с нашей страницы и отправлять ответ... ... Наш скрипт будет получать со страницы имя пользователя и отправлять назад приветствие... ... > Мы будем отправлять данные (введенное имя) в скрипт методом POST (а почему бы и нет... ... ) в переменной n и получать в ответ фразу 'Hello &hellip... ... Теперь он будет получать два значения: имя пользователя и его возраст и возвращать приветствие и год рождения пользователя (текущий год минус возраст)... Подробнее: http://fit-media.com/post_1262093659.htmlЗалепа №11. Зазеркалье отдыхает.
Степень соответствия запросу: 1,23%
Фрагменты текста поста : ... Он позволяет с помощью метаданных получать подробное описание типов, хранящихся в сборках... ... NET Framework использует отражение во время выполнения, чтобы получить важные сведения о загружаемых сборках... ... Говоря по-русски, отражение - механизм, позволяющий программам (включая и разработанные Вами модули) получать во время своей работы данные о типах (классах, их методах, свойствах и т... ... когда IntelliSense показывает список свойств, событий и методов объекта или класса, то он (IntelliSense) получает эти данные через отражение именно из той сборки, которая содержит требуемый класс... ... Что ж, здорово, когда можно получать данные непосредственно из скомпилированного модуля - информация окажется всегда актуальной, вне зависимости от версии этого самого модуля... ... ), то буду дополнять список прямо в этой статье... Подробнее: http://fit-media.com/post_1202747053.htmlОптимизация PHP-кода
Степень соответствия запросу: 1,22%
Фрагменты текста поста : ... Остерегайтесь волшебных методов, таких как __set , __get , __autoload... ... Если функции замены строк, может принимать в качестве аргументов как массивы, так и одиночные символы, и если ваш список аргументов не слишком длинный, подумайте над тем, чтобы записать несколько одинаковых выражений замены, проходя один символ за раз, вместо одной строки кода, которая принимает массив поиска и замены Лучше использовать конструкции else if , чем несколько конструкций if... ... Скорость вызовов метода, не зависит от количества методов в классе... ... Я добавил 10 методов в тестовый класс (до и после тестового метода) и производительность не изменилась... ... Методы в производных классах работают быстрее, чем они же, определённые в базовом классе... ... Не определяйте каждую структуру данных в виде класса - массивы бывают намного полезнее... Подробнее: http://fit-media.com/post_1207831883.htmlЗалепа №10 Cупер-хренорезка может все. Только хрен не режет.
Степень соответствия запросу: 0,83%
Фрагменты текста поста : ... Из первого выпадает список возможных вариантов, из второго - более-менее симпатичный календарик... ... Правда вызвало некоторое удивление то, что сворачивание/разворачивание списка осуществляется не методом, а свойством, что несколько противоречит здравому смыслу... ... По крайней мере это более-менее логичное объяснение такому странному проектированию класса контрола... ... И, как показывает практика, может оказаться вовсе и не методом, а например свойством или даже событием... ... :) Чем глубже я закапывался в изучение списка методов и свойств класса DateTimePicker, тем больше мне казалось, что его проектировали не совсем вменяемые люди... ... Поменяйте его тип с bool на int и к списку свойств GrowAndShrink и GrowOnly добавьте еще и None , и можно "облегчить" класс на целый метод... ... Понятно, нужно знать кто и когда соорудил тот или иной класс, особенно если это коммерческая разработка... Подробнее: http://fit-media.com/post_1202303173.htmlDropBox - убийца фалообменников
Степень соответствия запросу: 0,73%
Фрагменты текста поста : ... Public "... ... Все остальные папки и файлы, которые вы можете создать и которые НЕ будут находиться внутри папок Public или Photos никогда не будут доступны другим пользователям (за одним маленьким исключением, которое называется "... ... Public "... ... Для этого нужно получить public-ссылку на ваш альбом и отправить ее вашим друзьям по электронной почте или разместить в форуме... ... Чтобы получить паблик-ссылку перейдите в папку Photos , кликните правой кнопкой мыши по папке альбома (My First Album) и в меню выберите Dropbox / Copy Public Gallery Link : Вроде ничего не произошло, но на самом деле прямая ссылка на ваш фотоальбом была скопирована в буфер обмена (клипборд) и теперь вы можете вставить ее в письмо, в сообщение форума, в аську или просто в броузер для проверки... ... Public "... ... в ней можно получить паблик-ссылку на любой вложенный файл, но нельзя получить такую ссылку на папку... ... Так что смело копируйте нужные файлы в папку Public , получайте на них паблик-ссылки и заваливайте этим спамом все известные вам форумы... ... Еще раз напомню, что если вы удалите как-нить файлы из ваших папок Public или Photos (или любых других внутри папки My Dropbox ), то эти файлы тут же будут удалены с сервера... Подробнее: http://fit-media.com/post_1256945370.htmlЗалепа №8. Крах технологии от обычного int'а.
Степень соответствия запросу: 0,63%
Фрагменты текста поста : ... ) получать удовольствие от ее использования... ... namespace GluckTest { class MyCls { public int x... ... public static MyCls operator +(MyCls a, MyCls b) { MyCls rez = new MyCls()... ... Но давайте мысленно заменим класс MyCls на какой-нить нормальный класс с кучей полей, свойств, интерфейсов, закрытых и открытых методов, а так же "зароем" переопределение операции сложения куда-нибудь в пра-пра-пра-родителя этого класса... ... А теперь представьте, что Вам необходимо встроить этот класс в свой проект и сцепить его в плотный узел с десятками других классов и тысячами объектов... Подробнее: http://fit-media.com/post_1198554053.html14 принципов создания вежливых программ
Степень соответствия запросу: 0,22%
Фрагменты текста поста : ... Вот мой список того, что улучшает качество взаимодействия как с другими людьми, так и с программами... ... С большинством из них я общаюсь редко, но этот список включает в себя Дейва Карлика (Dave Carlick), которому я пишу письма постоянно... ... Он понимает, что тот, кому он оказывает услуги - это его босс, и что бы босс не хотел, он должен получить это... ... Тот же бармен помогает мне, повесив список цен передо мной на стенке... ... Когда служащему звонит знакомый из отдела продаж и объясняет, что можно получить большую выгоду если вот этот заказ обработать быстрее, он ускоряет его обработку... ... Как показывает приведенный список характеристик, в большинстве случаев сделать вежливую программу ничуть не труднее, чем невежливую... Подробнее: http://fit-media.com/post_1203349390.htmlЕсли бы microsoft не была такой ленивой...
Степень соответствия запросу: 0,22%
Фрагменты текста поста : ... Сама RCW представляет собой не что иное как DLL-файл , который придется таскать вместе с программой (без него тоже получите фолт, причем уже вне зависимости от наличия ворда на машине клиента)... ... А вот собственно и она: Пример класса: /*********************************/ /* Simple Spell Checker */ /* Copyright (C) FIT-Media, 2008 */ /* http://fit-media... ... public class SpellChecker : IDisposable { System... ... } } public static SpellChecker GetChecker() { return Checker... ... } public void Dispose() { if (com_app... ... } } public bool CheckWord(string word) { object[] arg = { word }... Подробнее: http://fit-media.com/post_1205882168.html
