Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Master of Orion
Эксперт .NET
6078 / 4934 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
1

Обнуляемые классы (не встроенный Nullable<T>) с параметрами по умолчанию

25.01.2013, 00:51. Просмотров 526. Ответов 3
Метки нет (Все метки)

Здравствуйте. Прочитал "чистый код" и возник в конце вопрос: насколько это актуально? Я что-то редко видел такие объекты. По сабжу: если тип MyClass может вернуть Null, то мы пишем класс NullMyClass и даем ему поведение по-умлочанию. То есть например было такой код:
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
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace NullableProj
{
    class Program
    {
        static void Main()
        {
            var col = new MyCollection();
            col.Add(new Person("Peter",18));
            var p = col.GetPersonByName("Anna");
            Console.WriteLine(p.Name);
            Console.ReadKey();
        }
    }
 
    class Person
    {
        public string Name { get; private set; }
        public int Age { get; private set; }
 
        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }
    }
 
    class MyCollection
    {
        private readonly List<Person> list = new List<Person>(); 
 
        public void Add(Person person)
        {
            list.Add(person);
        }
 
        public Person GetPersonByName(string name)
        {
            return list.FirstOrDefault(x => x.Name == name);
        }
    }
}
Очевидно, что тут вылетит эксепшн и надо писать
C#
1
2
3
4
5
6
7
8
9
10
11
        static void Main()
        {
            var col = new MyCollection();
            col.Add(new Person("Peter",18));
            var p = col.GetPersonByName("Anna");
            if (p != null) 
                Console.WriteLine(p.Name);
            else
                Console.WriteLine("Такого человека не существует!");
            Console.ReadKey();
        }
В книге предложен вариант: писать вот так:
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
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace NullableProj
{
    class Program
    {
        static void Main()
        {
            var col = new MyCollection();
            col.Add(new Person("Peter",18));
            var p = col.GetPersonByName("Anna");
            Console.WriteLine(p.Name);
            Console.ReadKey();
        }
    }
 
    class Person
    {
        public string Name { get; private set; }
        public int Age { get; private set; }
 
        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }
    }
 
    class NullPerson : Person
    {
        public NullPerson() : base("Такого человека не существует", 0)
        {
        }
    }
 
    class MyCollection
    {
        private readonly List<Person> list = new List<Person>(); 
 
        public void Add(Person person)
        {
            list.Add(person);
        }
 
        public Person GetPersonByName(string name)
        {
            return list.FirstOrDefault(x => x.Name == name) ?? new NullPerson();
        }
    }
}
И тогда никаких проверок в вызывающем коде не оказывается, потому что мы никогда не вернем Null, можем вернуть только объект с параметрами по-умолчанию. Вопрос: если такое применяется, почему я нигде такого не видел, а если не применяется, то почему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2013, 00:51
Ответы с готовыми решениями:

Классы и конструктор по умолчанию/с параметрами
Помогите пожалуйста! Необходимо сконструировать класс с заданным набором свойств. В данном случае,...

Как сделать открытие html-страничек в браузере, который стоит на ПК по умолчанию, а не через встроенный?
Как сделать в делфи открытие html страничек в браузере который стоит на пк по умолчанию,а не через...

Функция с параметрами по умолчанию
Помогите сделать прогу, Задание 1 (Функция с умалчиваемыми параметрам) Печать фамилии, курса и...

Конструктор с параметрами по умолчанию
Возможно ли создать конструктор с параметрами по умолчанию?? а то компилято мне ошибку выдает ...

3
Эксперт .NET
14688 / 11104 / 2917
Регистрация: 17.09.2011
Сообщений: 18,628
25.01.2013, 02:41 2
Честно сказать, тоже такого использования никогда не встречал - бредовое оно какое-то.
Чистая семантика - от одной мысли о человеке с именем "Такого человека не существует" и возрастом 0 лет как-то сразу бросает в пот и представляется Тадж-Махал.
Я уж не говорю о проверках.
C#
1
if (person is NullPerson) ...
C#
1
2
if (person.Name == "Такого человека не существует")
   MessageBox.Show("Превед, локализация!");
1
Эксперт Java
4069 / 3803 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
25.01.2013, 07:43 3
Такая техника (Null Object pattern) требует жесткого соблюдения - ведь если её использовать, то её нужно везде использовать, или придется каждый раз смотреть что возвращает метод: null или NullObject.
Например, ребята, которые пишут SharpDevelop используют этот паттерн в своей бибилиотеке NRefactory - https://github.com/icsharpcode/NRefactory
1
Master of Orion
Эксперт .NET
6078 / 4934 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.01.2013, 08:36  [ТС] 4
kolorotur, ну там же советуют добавить еще и метод bool IsNull который возвращает true, а в потомке переопределяется и возвращает false. Так что с этим проблем нет.
turbanoff, То есть оно используется? Но мне эта идея очень понравилась, почему же она в таком случае не получила такого распространение, как TDD, SOLID, MVC и пр?

This pattern should be used carefully as it can make errors/bugs appear as normal program execution.
Единственный минус, Который нашелся, зато куча плюсов.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2013, 08:36

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Конструктор с параметрами по умолчанию
пытаюсь создать класс с параметрами по умолчанию(я да, надеюсь, что я не путаюсь в терминах) ...

Шаблон с параметрами по умолчанию
Подскажите пожайлуста,что можно написать в коде вместо многоточий? Шаблон можно переписать с...

Шаблон функции с параметрами по умолчанию
Можно ли создать такую конструкцию? Если да, можно увидеть пример?

Функция возведения в степень с параметрами по умолчанию
Возведение числа n в степень р — это умножение числа n на себя р раз. Напишите функцию с именем...

Передача TMemo в функцию с параметрами по умолчанию
Как передать указатель на TMemo в функцию с параметрами по умолчанию? Нужно что-то вроде этого:...

Перегрузка функции шаблонами и параметрами по умолчанию
Такая проблема, надо написать header файл и к нему исходник, в которых нужно описать 3 функции и...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.