Проверка если автомобиль представляет собой спортивный автомобиль, основанный на скорости и лошадиных сил


У меня есть задание, где я должен проверить, если автомобиль является спортивным автомобилем или не менее максимальная скорость и минимальная мощность. Я закончил программу и она отлично работает. Я просто хочу увидеть, если вы можете просмотреть мое задание и увидеть, если есть место для совершенствования.

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

namespace Project3
{
class sportsCar
{
    public int _maxSpeed = 0;
    public int _horsepower = 0;
    private static int _MinimumRequiredSpeed = 150;
    private static int _MinimumRequiredHorsepower = 250;

    public bool IsSportsCar()
    {
        if ((_maxSpeed >= _MinimumRequiredSpeed) && (_horsepower >= _MinimumRequiredHorsepower))
            return true;
        else
            return false;
    }
    public void maxSpeed(int newmaxSpeed)
    {
        _maxSpeed = newmaxSpeed;
    }
    public void horsepower(int newhorsepower)
    {
        _horsepower = newhorsepower;
    }
}


class Program
{
    static void Main(string[] args)
    {
        sportsCar car = new sportsCar();

        Console.Write("What is the max speed? ");
        int newmaxSpeed = int.Parse(Console.ReadLine());
        Console.Write("What is the max horsepower? ");
        int newhorsepower = int.Parse(Console.ReadLine());

        car.maxSpeed(newmaxSpeed);
        car.horsepower(newhorsepower);

        bool sportCar = car.IsSportsCar();
        if (sportCar == true)
        {
            Console.WriteLine("This is Definately a Sports Car");
        }
        else
        {
            Console.WriteLine("This is NOT a Sports Car");
        }
    }
}
}


916
10
задан 15 октября 2011 в 03:10 Источник Поделиться
Комментарии
4 ответа

_maxSpeed и _horsePower должны быть частными.

Вы (ошибочно назван) сеттер методы для публичных переменных, а не добытчики. Что делает для странного интерфейса.

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

public int _maxSpeed = 0;
public int _horsepower = 0;
public void maxSpeed(int newmaxSpeed)
{
_maxSpeed = newmaxSpeed;
}
public void horsepower(int newhorsepower)
{
_horsepower = newhorsepower;
}

У вас есть

public int MaxSpeed { get; set; }
public int HorsePower { get; set; }

Так как эти значения вряд ли изменится, вы могли бы сделать тип неизменяемым:

class Car
{
public readonly int MaxSpeed;
public readonly int HorsePower;

public Car( int maxSpeed, int horsePower )
{
MaxSpeed = maxSpeed;
HorsePower = horsePower;
}
}

Вместо того, чтобы проверить логическое выражение, а затем возвращаются в буквальном истинные или ложные, просто вернуть выражение. Логические значения типа как и любой другой. Кроме того, вам не нужно сравнение с истинной или ложной по той же причине.

if( someCondition == true )
return true;
else
return false;

У вас есть

if( someCondition )
return true;
else
return false;

или еще лучше

return someCondition;

Так

return _maxSpeed >= _MinimumRequiredSpeed && 
_horsepower >= _MinimumRequiredHorsepower;

Всякий раз, когда вы принять ввод пользователя, вы должны проверить его. Ваша программа рухнет, если пользователь вводит что-то, что не является числом. Вы можете проверить это, используя метод tryparse вместо разбора.

int horsePower;
do
{
string input = Console.ReadLine();
}
while( !int.TryParse( input, out horsePower ) );

Другие, чем, что это прекрасно, продолжай ;)

15
ответ дан 15 октября 2011 в 04:10 Источник Поделиться

Другой ответами, поймали большинство вопросов я вижу, но вот несколько мелких:


  • В C# (ну, .Чистой), вы должны следовать стандартным соглашениям об именовании. В частности, классы, свойства и методы должны быть PascalCased.

  • Ты написала "наверняка" неправильно ;)

5
ответ дан 17 октября 2011 в 09:10 Источник Поделиться

Вот как я хотел его убрать (пояснения ниже):

namespace Project3
{
using System;

internal sealed class SportsCar
{
private const int MinimumRequiredSpeed = 150;
private const int MinimumRequiredHorsepower = 250;
private readonly int maxSpeed;
private readonly int horsepower;

public SportsCar(int maxSpeed, int horsepower)
{
this.maxSpeed = maxSpeed;
this.horsepower = horsepower;
}

public bool IsSportsCar()
{
return (this.maxSpeed >= MinimumRequiredSpeed) && (this.horsepower >= MinimumRequiredHorsepower);
}

public int MaxSpeed
{
get
{
return this.maxSpeed;
}
}

public int Horsepower
{
get
{
return this.horsepower;
}
}
}

internal static class Program
{
private static void Main()
{
Console.Write("What is the max speed? ");
int newmaxSpeed;
if (!int.TryParse(Console.ReadLine(), out newmaxSpeed))
{
Console.WriteLine("Invalid max speed!");
return;
}

Console.Write("What is the max horsepower? ");
int newhorsepower;
if (!int.TryParse(Console.ReadLine(), out newhorsepower))
{
Console.WriteLine("Invalid max horsepower!");
return;
}

SportsCar car = new SportsCar(newmaxSpeed, newhorsepower);
bool sportCar = car.IsSportsCar();
if (sportCar)
{
Console.WriteLine("This is Definitely a Sports Car");
}
else
{
Console.WriteLine("This is NOT a Sports Car");
}
}
}
}


  • Убрали подчеркивание из имен переменных. Я лично их не люблю, но это до вас (или ваших стандартов группы).

  • Изменено имя класса 'спорткар', чтобы встретиться .Чистая руководящих принципов именования (классы должны быть буквицы в форме, известной как PascalCasing).

  • В MinimumRequired переменных являются постоянными, поэтому они объявлены как константные.

  • Поскольку скорость и мощность должны быть инвариантны для автомобиля, я сделал их только для чтения и устанавливается через конструктор.

  • Следовательно, они теперь частная , но доступная через геттер свойства.

  • В IsSportsCar метод является упрощенным, поскольку оценка-это уже логический конструкт (т. е. нет необходимости возвращать значение true, и возвращает false , как это оценивает как таковой).

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

  • В программа класс сейчас статическим , поскольку он содержит только один статический метод.

  • Занятых применением инт.Метод tryparse() вместо инт.Метод Parse() , чтобы разрешить выполнение программы будет проще, если недопустимый ввод набирается.

  • Удалил лишние ', используя' директив.

  • Исправлено "наверняка".

Я бы также добавить либеральное количество комментариев. .Net имеет очень хорошую систему документации, которая позволяет "комментарии XML" в классе, переменных, свойств и методов уровня, который будет выглядеть примерно так:

    /// <summary>
/// Determines whether this particular car meets the criteria of being a sports car. Its maximum speed must
/// be at least MinimumRequiredSpeed AND the horsepower must be at least MinimumRequiredHorsepower.
/// </summary>
/// <returns>
/// <c>true</c> if this car is a sports car; otherwise, <c>false</c>.
/// </returns>
public bool IsSportsCar()
{
return (this.maxSpeed >= MinimumRequiredSpeed) && (this.horsepower >= MinimumRequiredHorsepower);
}

Это просто пример, не стоит недооценивать силу в код комментировать, а также.

Последнее, что я подумал. Есть объектно-ориентированный принцип, известный как СРП, или единый принцип ответственности. Это означает, что каждый класс, который вы дизайн должен иметь одну и только одну цель, которая весьма ограниченную сферу применения. То же самое можно сказать для себя методы. Вы никогда не знаете, когда вам может потребоваться рефакторинг логики метода, чтобы использовать в другом месте. Так что даже если это банальный пример, вы могли бы хотеть смотреть в переписывание IsSportsCar() на три отдельных метода:

    public bool IsSportsCar()
{
return this.MeetsMinimumSpeedRequirements() && this.MeetsMinimumHorsepowerRequirements();
}

private bool MeetsMinimumSpeedRequirements()
{
return this.maxSpeed >= MinimumRequiredSpeed;
}

private bool MeetsMinimumHorsepowerRequirements()
{
return this.horsepower >= MinimumRequiredHorsepower;
}

Теперь, если ваш спортивный автомобиль не должен делать какие-либо проверки в отношении только скорость или мощность, вы его логически разделены.

Удачи!

5
ответ дан 17 октября 2011 в 02:10 Источник Поделиться

Вы код выглядит разумным, но я бы пару относительно небольшие предложения:


  • Вы посмотрите, что происходит, когда пользователь вводит неверный номер? Т. е. строка, содержащая буквы или даже строку, которая может быть интерпретирована как число, но не в допустимый диапазон (например, отрицательное или слишком большое, чтобы быть применимым к любой жизненной автомобиля)? Таким образом, вы могли бы хотеть смотреть на обработку возможных исключений из инт.Разобрать и определить какой-то приемлемый диапазон значений. Если вы действительно хотите произвести впечатление на своего учителя, сделать этот диапазон настраивается (с помощью свойств.Параметры механизма). На максимальной скорости метод предназначен для проверки диапазона действия.

  • Сделать _maxSpeed_horsepower) частная.

  • Название скоростьмощность) слегка вводит в заблуждение. На первый взгляд, казалось бы возвращать максимальная скорость, а не установить его. Только после визуально "разбор" метод подписи и/или как это называется, становится понятно, что это на самом деле сеттер - само название DOS не предлагаю своей цели. Так что либо измените имя на setMaxSpeed, или использовать только для записи (и "настоящий" сеттер).

  • Переименовать купе только автомобиль, поскольку, в конце концов, IsSportsCar не гарантированно вернуть правда.

  • Не все ваши с помощью директивы необходимы.

3
ответ дан 15 октября 2011 в 03:10 Источник Поделиться