Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
PlutDem
2 / 2 / 0
Регистрация: 23.02.2012
Сообщений: 197
#1

Организация методов для работы со структурами - C#

24.04.2014, 01:41. Просмотров 409. Ответов 3
Метки нет (Все метки)

Предположим у нас есть структура реализующая векторы. Я задался вопросом как лучше организовать методы, такие как сложение, вычитание, нормализация, скалярное произведение и т.п.
Нужно ли делать их статическими или привязать к объекту?
Методы должны изменять текущий вектор или возвращать копию? Скажем при сложении векторов можно вернуть их сумму как новый объект, либо прибавить второй непосредственно к первому тем самым изменив первый объект.
Должны ли методы всегда возвращать объект вне зависимости новый он или старый? Это позволит делать цепочку вызовов наподобие этой
C#
1
vector.ApplyRotation(234).Add(anotherVector).MultiplyOnScalar(100)
что очень удобно, но я не уверен насколько это затронет производительность.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2014, 01:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Организация методов для работы со структурами (C#):

разработать класс для работы с динамическими структурами - C#
вот задание. Помогите пожалуйста(( Множество целых чисел представляется как однонаправленный линейный список. Класс Данные: ...

Построить программу для работы со структурами - правильными дробями - C#
1) Построить программу для работы со структурами-правильными дробями. Структура должна включать соответствующие поля: числитель,...

Организация методов пользовательских классов - C#
Описать структуру с именем ZNAK, содержащую следующие поля: - фамилия, имя; - знак Зодиака; - дата рождения (массив из трех чисел). ...

Принцип работы со структурами - C#
Доброго вечера Помогите, пожалуйста, разобраться со структурами на C# Вот есть задача: Даны натуральные числа N, M. Найти все...

Создать класс Tochka. Реализовать в классе конструктор по умолчанию (без параметров) и с параметрами, ряд методов для работы с точками плоскости - C#
(Создать класс Tochka. Реализовать в классе конструктор по умолчанию (без параметров) и с параметрами, ряд методов для работы с точками...

Организация работы с Excel - C#
При организации работы с Excel, создается соответствующий процесс Microsoft Office Excel, который и получает команды от нашей программы,...

3
Not_Jon_Skeet
146 / 138 / 43
Регистрация: 03.03.2014
Сообщений: 368
24.04.2014, 02:53 #2
Раз, два и три. Дальше или сами гуглите по словосочетанию перегрузка операторов, или спрашиваете что-то здесь.
0
PlutDem
2 / 2 / 0
Регистрация: 23.02.2012
Сообщений: 197
24.04.2014, 03:15  [ТС] #3
Not_Jon_Skeet, перегрузка операторов вещь, конечно, хорошая, но весь функционал на них не повесить.
По сути, выбор стоит между этими тремя реализациями методов
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public Vector MultiplyOnScalar(float scalar)
{
    X *= scalar;
    Y *= scalar;
    return this;
}
 
public Vector MultiplyOnScalar(float scalar)
{
    return new Vector(X * scalar, Y * scalar);
}
 
public static Vector MultiplyOnScalar(Vector vector, float scalar)
{
    return new Vector(vector.X * scalar, vector.Y * scalar);
}
В разных библиотеках видел разные реализации. Хотелось бы узнать от чего зависит выбор той или иной.
0
Not_Jon_Skeet
146 / 138 / 43
Регистрация: 03.03.2014
Сообщений: 368
24.04.2014, 04:09 #4
Все зависит от задач какие вы решаете. Любой вариант заслуживает право быть, ну кроме вашего первого метода, пожалуй.
Первый ваш метод сначала меняет значение исходного вектора, а затем создает новый экземпляр класса Вектор. Логичнее тогда уже сделать тип метода void.
Второй и третий метод также возвращают новый экземпляр класса Вектор, но при этом не меняют исходный вектор.
Третий метод является статическим.
Но повторюсь, перегрузками операторов вы добьетесь реализации если не всех, то 80% всех возможных операций над векторами. Посмотрите на пример ниже. Где проще синтаксис? И подберите, что вашей душе ближе.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace VectorTest
{
    public struct Vector
    {
        public double X { get; set; }
        public double Y { get; set; }
 
        public Vector(double x, double y) : this()
        {
            this.X = x;
            this.Y = y;
        }
 
        public Vector MultiplyOnScalar(double scalar)
        {
            X *= scalar;
            Y *= scalar;
            return this;
        }
 
        public void MultipyOnScalar1(double scalar)
        {
            X *= scalar;
            Y *= scalar;
        }
 
        public Vector MultiplyOnScalar2(double scalar)
        {
            return new Vector(X*scalar,Y*scalar);
        }
 
        public static Vector MultiplyOnScalar3(Vector vector, double scalar)
        {
            return new Vector(vector.X * scalar, vector.Y * scalar);
        }
 
        public static Vector operator *(Vector v, double scalar)
        {
            return new Vector(v.X*scalar, v.Y*scalar);
        }
 
        public override string ToString()
        {
            return string.Format("({0},{1})", this.X, this.Y);
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Vector a = new Vector(1,1);
            Vector b = new Vector(2,5);
            
            Console.WriteLine(a.ToString());
            Console.WriteLine(b.ToString());
            Console.WriteLine();
 
            Vector c = a.MultiplyOnScalar(4);
            Console.WriteLine(c);
            Console.WriteLine(a);
            Console.WriteLine();
            
            b.MultipyOnScalar1(2);
            Console.WriteLine(b.ToString());
 
            Console.WriteLine();
            Vector d = Vector.MultiplyOnScalar3(a, 3);
            Console.WriteLine(a);
            Console.WriteLine(d);
 
            Console.WriteLine();
            Vector e = a*4;
            Console.WriteLine(e);
 
            Console.ReadLine();
        }
    }
}
0
24.04.2014, 04:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2014, 04:09
Привет! Вот еще темы с ответами:

Принцип работы асинхронных методов Socket - C#
часто возникают не очень понятные ситуации при отладке программ, призванные передавать данные посредством класса Socket: чаще всего, когда...

Покритикуйте пару методов работы с массивом - C#
Минимальный элемент k-й строки равен максимальному элементу k-го столбца. class Program { static bool TEST(bool a, int...

Организация работы с данными. Память или БД - C#
Здравствуйте. Текущий проект предполагает огромный обьем работы с данными в нескольких потоках. Есть два варианта работы, загружать...

Чем XPath лучше других методов работы с XML? - C#
Здравствуйте. Не раз натыкался на темы, где у автора возникали проблемы с работай с XML, часто видел ответ :"Используй лучше xpath ". ...


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

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

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