Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
PlutDem
2 / 2 / 2
Регистрация: 23.02.2012
Сообщений: 200
1

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

24.04.2014, 01:41. Просмотров 446. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

3
Not_Jon_Skeet
149 / 141 / 73
Регистрация: 03.03.2014
Сообщений: 368
24.04.2014, 02:53 2
Раз, два и три. Дальше или сами гуглите по словосочетанию перегрузка операторов, или спрашиваете что-то здесь.
0
PlutDem
2 / 2 / 2
Регистрация: 23.02.2012
Сообщений: 200
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
149 / 141 / 73
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2014, 04:09

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

Покритикуйте пару методов работы с массивом
Минимальный элемент k-й строки равен максимальному элементу k-го столбца. class Program { ...

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


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

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

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