Треки
/
C#
C#
/
Вправи
/
Побудова телеметрії
Побудова телеметрії

Побудова телеметрії

Навчальна вправа

Вступ

Параметри

У цій вправі ми розглянемо деякі деталі параметрів методів і їх використання в C#.

Параметри передають інформацію від методу, що викликає, до викликаного методу.

  • Поведінку параметрів можна змінити за допомогою таких модифікаторів, як ref і out.

  • Параметр із модифікатором out передає значення назад від викликаного методу до того, хто викликав. Цей параметр можна передати викликаному методу без ініціалізації, і в будь-якому разі всередині викликаного методу з ним поводяться так, ніби на вході його не було ініціалізовано. Розібратися в поведінці та правилах щодо модифікаторів параметрів найлегше на прикладах (див. нижче) і повідомленнях компілятора.

void Foo(out int val)
{
    val = 42;
}
void Bar(int val)
{
    val = 42;
}

int importantValue = 1729;
Foo(out importantValue);
var result = importantValue == 42;
// => true

importantValue = 1729;
Bar(importantValue);
result = importantValue == 1729;
// => true
  • Параметрам out потрібно присвоїти значення всередині викликаного методу.

  • Параметр із модифікатором ref передає значення у викликаний метод. Коли метод повертає керування, той, хто викликав, побачить у цьому параметрі всі зміни, які зробив викликаний метод.

void Foo(ref int val)
{
    val *= 7;
}

int importantValue = 6;
Foo(ref importantValue);
return importantValue;
// => 42
  • Параметри ref мають бути змінними, оскільки викликаний метод працюватиме безпосередньо з тим параметром, який бачить той, хто викликав.
  • Модифікатори out і ref потрібні як у сигнатурі викликаного методу, так і в місці виклику.

Вказівки

Проєкт радіокерованого автомобіля, який ми започаткували у вправі classes, пройшов добре (вітаємо!), і завдяки низці нещодавніх спонсорських угод у бюджеті є гроші на вдосконалення.

Частину бюджету спрямували на телеметрію.

Щоб догодити спонсорам, на автомобіль встановили панель, яка показує імена спонсорів, поки він їде по трасі.

Зауважмо, що поява цих новомодних технологій різко скоротила час роботи батареї автомобіля.

1. Додайте радіокерованому автомобілю можливість показувати імена спонсорів

Реалізуйте SetSponsors(), щоб вона приймала одне або кілька імен спонсорів і зберігала їх на автомобілі.

Зауважмо, що аргумент методу SetSponsors() гарантовано не буде null.

Реалізуйте DisplaySponsor(), щоб показувати вибраного спонсора. Перший переданий спонсор має sponsorNum 0, другий - 1, і так далі.

var car = RemoteControlCar.Buy();
car.SetSponsors("Exercism", "Walker Industries", "Acme Co.");
var sp2 = car.DisplaySponsor(sponsorNum: 1);
// => "Walker Industries"

2. Отримайте дані телеметрії автомобіля

Реалізуйте метод RemoteControlCar.GetTelemetryData().

GetTelemetryData() має надавати відсоток заряду батареї та подолану відстань у метрах через параметри out.

GetTelemetryData() має повертати false, якщо аргумент serialNum менший за попередньо отримане значення. (Тут є проблема з кількома вузлами телеметрії, які беруть участь). У цьому випадку serialNum буде встановлено на найбільший попередній serialNum, а як відсоток заряду батареї, так і подолані метри буде встановлено на -1. Якщо виклик успішний, serialNum залишається без змін.

var car = RemoteControlCar.Buy();
car.Drive();
car.Drive();
int serialNum = 4;
car.GetTelemetryData(ref serialNum, out int batteryPercentage, out int distanceDrivenInMeters);
// => true, 4L, 80, 4

serialNum = 1;
car.GetTelemetryData(ref serialNum, out batteryPercentage, out distanceDrivenInMeters);
// => false, 4L, -1, -1

3. Додайте функціональність, щоб система телеметрії могла отримувати витрату заряду на метр

Реалізуйте метод TelemetryClient.GetBatteryUsagePerMeter().

Він викликатиме RemoteControlCar.GetTelemetryData(). Якщо GetTelemetryData() повертає false або автомобіль не їздив, то ця процедура має повернути «no data». Якщо GetTelemetryData() повертає true, то має бути повернуто повідомлення такого вигляду: «usage-per-meter=BATTERY-USAGE-PER-METER». Де розрахунок такий: (100 - поточний відсоток заряду батареї), поділене на подолану на цей момент відстань у метрах.

var car = RemoteControlCar.Buy();
car.Drive();
car.Drive();
var tc = new TelemetryClient(car);
int serialNum = 4;
tc.GetBatteryUsagePerMeter(serialNum);
// => "usage-per-meter=5"

serialNum = 1;
tc.GetBatteryUsagePerMeter(serialNum);
// => "no data"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
C# Exercism

Час розпочати Побудова телеметрії?

Зареєструйтеся на Exercism, щоб вивчати й опановувати C#, а також 62 концепції178 вправ та справжнє наставництво від людей, і все це безкоштовно.