Главная страница » C# » 35. Детерминированность
Детерминированность — это свойство кода, при котором одинаковые входные данные всегда дают одинаковый результат.
| Тип кода | Описание | Пример |
|---|---|---|
| ✅ Детерминированный | Одинаковые входные данные → один и тот же результат | 2 + 3 всегда = 5 |
| ❌ Недетерминированный | Результат зависит от внешних факторов | Random().Next(1, 100) |
📌 Пример кода:
// Детерминированная функция
int Sum(int a, int b)
{
return a + b;
}
Console.WriteLine(Sum(2, 3)); // Всегда 5
// Недетерминированная функция
int GetRandomNumber()
{
return new Random().Next(1, 100);
}
Console.WriteLine(GetRandomNumber()); // Разные числа
| Тип операции | Примеры | Детерминированность |
|---|---|---|
| Арифметика | +, -, *, / |
✅ Детерминированная |
| Строковые методы | ToUpper(), Replace() |
✅ Детерминированная |
| Дата и время | DateTime.Now |
❌ Недетерминированная |
| Случайные числа | Random().Next() |
❌ Недетерминированная |
| Чтение файлов | File.ReadAllText() |
❌ Недетерминированная |
📌 Пример:
Console.WriteLine(DateTime.Now); // Каждый раз разное время
| Преимущество | Описание |
|---|---|
| 📌 Предсказуемость | Код проще тестировать |
| 🚀 Кэширование | Можно сохранить результат и не вычислять заново |
| 🏆 Безопасность в многопоточной среде | Детерминированные функции легче параллелить |
📌 Пример кэширования результата:
Dictionary cache = new Dictionary();
int Square(int x)
{
if (!cache.ContainsKey(x))
{
cache[x] = x * x;
}
return cache[x];
}
Console.WriteLine(Square(5)); // Кэширует и возвращает 25
Console.WriteLine(Square(5)); // Берёт из кэша
") – Строки (string)Двойные кавычки используются для текстовых данных (string).
Dictionary cache = new Dictionary();
int Square(int x)
{
if (!cache.ContainsKey(x))
{
cache[x] = x * x;
}
return cache[x];
}
Console.WriteLine(Square(5)); // Кэширует и возвращает 25
Console.WriteLine(Square(5)); // Берёт из кэша
| ❌ Плохая практика | ✅ Хорошая альтернатива |
|---|---|
DateTime.Now внутри функции |
Передавать дату как аргумент |
new Random() внутри функции |
Передавать Random как параметр |
| Использование глобальных переменных | Локальные переменные |
📌 Пример с Random:
// Плохой вариант: каждый раз создаётся новый объект Random
int GetRandomValue()
{
return new Random().Next(1, 100);
}
// Хороший вариант: передаём генератор случайных чисел
int GetRandomValue(Random random)
{
return random.Next(1, 100);
}
Random rnd = new Random();
Console.WriteLine(GetRandomValue(rnd)); // Теперь более предсказуемо
| ✅ Детерминированность | ❌ Недетерминированность |
|---|---|
| Один и тот же вход → один и тот же выход | Результат зависит от внешних факторов |
| Легче тестировать и отлаживать | Труднее предсказать результат |
| Подходит для многопоточности | Может вызвать неожиданные баги |
🚀 Вывод:
Используйте детерминированные функции, когда это возможно!
| Задание | Что нужно сделать |
|---|---|
| 1️⃣ | Написать детерминированную функцию, которая принимает строку и делает её заглавной с ! в конце ("hello" → "HELLO!") |
| 2️⃣ | Написать недетерминированную функцию, которая возвращает случайное число от 1 до 10 |
📌 Пример решения:
string message = "Hello, world!";
char quote = '\"';
string path = @"C:\Users\Admin";
Попробуйте написать и запустить этот код, чтобы убедиться в правильности выполнения операций и особенностях работы с числами с плавающей точкой.
Телефон: +375 33 910-08-92
Email: info@codefor.tech
Адрес: г. Барановичи, ул. Пирогова, д. 7
© 2024-2025 Все права защищены. CodeFor.
Язык сайта: