leshqow
@leshqow
-l-

Как проверить значения переменных в конструкторе?

В классе установлены значения переменных по умолчанию:
int topA = 95;
int topB = 1;
int topC = 89;

Реализованы свойства с логикой:
public int TopA
        {
            get
            {
                return topA;
            }
            set
            {
                if (value > 0)
                    topA = value;
            }
        }
        public int TopB
        {
            get
            {
                return topB;
            }
            set
            {
                if (value > 0)
                    topB = value;
            }
        }
        public int TopC
        {
            get
            {
                return topC;
            }
            set
            {
                if (value > 0)
                    topC = value;
            }
        }


И есть метод:
public bool CheckingAngle()
        {
            bool check = true;
            if ((TopA + TopB + TopC) < 180 || (TopA + TopB + TopC) > 180)
                check = false;
            return check;
        }


Необходимо чтобы при инициализации объекта (т.е. вызове конструктора) метод проверял сумму этих переменных и либо по новой запрашивал значения либо прерывал с ошибкой.
Вообще какая практика считается хорошей в данном случае ? Исключение, консольное сообщение или еще что?
  • Вопрос задан
  • 348 просмотров
Решения вопроса 1
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
Необходимо чтобы при инициализации объекта (т.е. вызове конструктора) метод проверял сумму этих переменных и либо по новой запрашивал значения либо прерывал с ошибкой.

а в чем трудности?
вы не привели полный синтаксис класса. но в общем случае достаточно
int topA = 95;
int topB = 1;
int topC = 89;
после создания класса, проверять ни чего не надо. а вот после манипуляций - да, возможно надо. но это уже уровень вашей ответственности, при написании логики (реализуйте свою цель, вот и все)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Namynnuz
Необходимо чтобы при инициализации объекта (т.е. вызове конструктора) метод проверял сумму этих переменных и либо по новой запрашивал значения либо прерывал с ошибкой.

Зачем?

Если нужно сделать всё в едином классе, то достаточно написать статический метод и в нём проверять, после чего уже создавать объект. Бросать исключения в конструкторе — плохая идея. Бросать исключения в принципе — идея неплохая, но они все должны быть уловлены блоками try-catch, с записью в лог или ещё куда.
Если стоит задача написать консольное приложение, который бы инициализировало класс с правильными значениями, то оно может выглядеть, к примеру, так:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Toster.Q561594 {
    public static class Extentions {
        public static string Join<T>( this IEnumerable<T> list, string separator = "," )
            => string.Join( separator, list );
        public static int[] ConvertConsoleInput( this string input, params char[] separators )
            => input.Split( separators, StringSplitOptions.RemoveEmptyEntries )
                        .Select( int.Parse )
                        .ToArray();
    }

    public class Triangle {
        public readonly int A;
        public readonly int B;
        public readonly int Y;

        public Triangle(int a, int b, int y) {
            A = a; B = b; Y = y;
        }

        public static bool IsValidAngles( int a, int b, int y )
            => a > 0 && b > 0 && y > 0 && ( a + b + y ) == 180;

        public override string ToString()
            => $"( {nameof( A )}: {A}, {nameof( B )}: {B}, {nameof( Y )}: {Y} )";
    }

    class Program {
        static void Main( string[] args ) {
            int[] temp;

            while ( true ) {
                Console.Write( "Enter three valid space separated angles and press Enter: " );
                try {
                    temp = Console.ReadLine().ConvertConsoleInput( ' ' );
                    if ( temp.Length != 3 )
                        throw new IndexOutOfRangeException($"Incorrect number of angles: {temp.Length}");
                    if ( Triangle.IsValidAngles( temp[0], temp[1], temp[2] ) )
                        break;
                    else
                        throw new InvalidOperationException( $"Incorrect angles: ( {temp.Join( ", " )} )" );
                    
                } catch ( Exception ex ) {
                    Console.WriteLine( "Error. " + ex.Message + Environment.NewLine );
                }
            }

            var triangle = new Triangle( temp[0], temp[1], temp[2] );

            Console.WriteLine( $"Valid triangle object was created: {triangle.ToString()}" );
            Console.ReadLine();
        }
    }
}

При работе в консоли это будет выглядеть как-то так:

Enter three valid space separated angles and press Enter: i'm typing
Error. Input string was not in a correct format.

Enter three valid space separated angles and press Enter: 1 2 3
Error. Incorrect angles: ( 1, 2, 3 )

Enter three valid space separated angles and press Enter: 100 10000
Error. Incorrect number of angles: 2

Enter three valid space separated angles and press Enter:    5  100    75
Valid triangle object was created: ( A: 5, B: 100, Y: 75 )

Обрати внимание на статический класс Extentions, статические методы которого имеют у первого аргумента this. Это методы расширений, они позволяют расширять уже имеющиеся классы, как если бы у них существовали эти методы. StringSplitOptions.RemoveEmptyEntries в ConvertConsoleInput отбрасывает получившиеся пустые строки, поэтому вводить можно хоть «__4____152______24___», оно это превратит сначала в string[] { "4", "152", "24" }, а потом распарсит и выдаст int[] { 4, 152, 24 };
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы