C# | Вопросы собесов
5.1K subscribers
35 photos
1 file
983 links
Download Telegram
🤔 Какое значение по умолчанию имеет тип bool в C#?
Anonymous Quiz
16%
true
72%
false
9%
null
3%
0
📌 Что такое делегат?

💬 Спрашивают в 78% собеседований

Делегат — это тип, который безопасно инкапсулирует метод, подобно указателю на функцию в других языках программирования, но с проверкой типов во время компиляции. Делегаты могут ссылаться на метод, который принимает параметры и возвращает значение. Они используются для реализации обратных вызовов и событий, а также для определения пользовательских операций, которые могут быть выполнены методом, принимаемым в качестве параметра.

🤔 Зачем они нужны?

Делегаты предоставляют способ передачи методов в качестве аргументов другим методам. Это полезно для реализации шаблонов проектирования, таких как наблюдатель (Observer), стратегия (Strategy), и для создания асинхронных вызовов. Они позволяют абстрагироваться от конкретных методов, передавая вместо этого ссылку на метод, что делает код более гибким и масштабируемым.

🤔 Пример:
// Определение делегата
public delegate int Operation(int x, int y);

class Program
{
static void Main(string[] args)
{
// Создание экземпляра делегата, ссылающегося на метод Add
Operation op = Add;

// Вызов метода через делегат
int result = op(5, 5);
Console.WriteLine(result); // Вывод: 10

// Делегат теперь ссылается на метод Subtract
op = Subtract;

// Повторный вызов метода через делегат
result = op(10, 5);
Console.WriteLine(result); // Вывод: 5
}

static int Add(int x, int y)
{
return x + y;
}

static int Subtract(int x, int y)
{
return x - y;
}
}


В этом примере делегат Operation может ссылаться на любой метод, который принимает два целочисленных параметра и возвращает целое число. Сначала делегат ссылается на метод Add, затем на Subtract. Это демонстрирует, как можно динамически изменять методы, на которые указывает делегат, обеспечивая гибкость в выборе выполняемой операции.

🤔 Краткий ответ:

Делегаты — мощный инструмент для создания гибких и масштабируемых приложений, позволяющий передавать методы как параметры, использовать их для определения событий и реализовывать асинхронные операции. Они обеспечивают безопасный и типобезопасный способ работы с методами в качестве объектов первого класса.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
📌 Что такое принципы SOLID?

💬 Спрашивают в 78% собеседований

🤔 Принципы SOLID — это набор из пяти основных принципов ООП и проектирования, направленных на повышение гибкости, поддерживаемости и масштабируемости программного обеспечения. Эти принципы помогают разработчикам предотвращать проблемы, связанные с плохим проектированием, такие как жесткая связанность компонентов, слабая коэзия и чрезмерная сложность системы. Они были введены Робертом Мартином и являются акронимом, образованным от первых букв названий этих принципов:

1️⃣ Single Responsibility Principle (Принцип единственной ответственности):

Класс должен иметь только одну причину для изменения. Это означает, что в идеале класс должен решать только одну задачу или иметь одну область ответственности. Разделение обязанностей помогает сделать систему более гибкой и упрощает тестирование и поддержку кода.

2️⃣ Open/Closed Principle (Принцип открытости/закрытости):

Программные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для модификации. Это значит, что можно легко добавлять новую функциональность без изменения существующего кода, что делает систему более модульной и устойчивой к изменениям.

3️⃣ Liskov Substitution Principle (Принцип подстановки Барбары Лисков):

Объекты в программе должны быть заменяемы на экземпляры их подтипов без изменения правильности выполнения программы. Проще говоря, производные классы должны быть способны заменять свои базовые классы без нарушения работы программы.

4️⃣ Interface Segregation Principle (Принцип разделения интерфейса):

Клиенты не должны быть вынуждены зависеть от интерфейсов, которые они не используют. Этот принцип подразумевает создание специализированных интерфейсов вместо одного, "делающего всё". Такой подход упрощает управление зависимостями и обеспечивает большую гибкость в разработке.

5️⃣ Dependency Inversion Principle (Принцип инверсии зависимостей):

Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба типа модулей должны зависеть от абстракций. Кроме того, абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций. Этот принцип направлен на уменьшение зависимостей между компонентами программы, что упрощает модификацию и тестирование системы.

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

🤔 Краткий ответ:

Принципы SOLID — это пять правил для создания хорошо структурированного и легко поддерживаемого кода. Они помогают делать программы гибкими и открытыми для расширения, но закрытыми для изменений, уменьшая при этом взаимозависимость между различными частями программы.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
🤔 Какой из следующих интерфейсов определяет метод MoveNext()?
Anonymous Quiz
35%
IEnumerable
52%
IEnumerator
8%
ICollection
5%
IList
📌 Какие бывают коллекции?

💬 Спрашивают в 11% собеседований

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

🤔 Основные категории коллекций

1️⃣ Коллекции общего назначения

2️⃣ Специализированные коллекции

3️⃣ Параллельные коллекции

🤔 Коллекции общего назначения

1️⃣ List<T>: Динамический массив, который автоматически изменяет свой размер по мере добавления элементов.
   List<int> numbers = new List<int> { 1, 2, 3, 4 };
numbers.Add(5);


2️⃣ Dictionary<TKey, TValue>: Коллекция пар ключ-значение. Обеспечивает быстрый доступ к значению по ключу.
   Dictionary<string, int> ages = new Dictionary<string, int>
{
{ "Alice", 30 },
{ "Bob", 25 }
};
int aliceAge = ages["Alice"];


3️⃣ HashSet<T>: Коллекция уникальных элементов. Используется для предотвращения дублирования.
   HashSet<string> fruits = new HashSet<string> { "Apple", "Banana" };
fruits.Add("Apple"); // Не добавит дубликат


4️⃣ Queue<T>: Очередь, работающая по принципу FIFO (First In, First Out).
   Queue<string> queue = new Queue<string>();
queue.Enqueue("first");
queue.Enqueue("second");
string item = queue.Dequeue(); // "first"


5️⃣ Stack<T>: Стек, работающий по принципу LIFO (Last In, First Out).
   Stack<string> stack = new Stack<string>();
stack.Push("first");
stack.Push("second");
string item = stack.Pop(); // "second"


🤔 Специализированные коллекции

1️⃣ LinkedList<T>: Двусвязный список, позволяющий быстро вставлять и удалять элементы.
   LinkedList<int> linkedList = new LinkedList<int>();
linkedList.AddLast(1);
linkedList.AddLast(2);


2️⃣ SortedList<TKey, TValue>: Коллекция пар ключ-значение, отсортированная по ключам.
   SortedList<string, int> sortedList = new SortedList<string, int>
{
{ "Alice", 30 },
{ "Bob", 25 }
};


3️⃣ SortedDictionary<TKey, TValue>: Похож на SortedList, но использует бинарное дерево для хранения элементов.
   SortedDictionary<string, int> sortedDict = new SortedDictionary<string, int>
{
{ "Alice", 30 },
{ "Bob", 25 }
};


4️⃣ SortedSet<T>: Отсортированное множество уникальных элементов.
   SortedSet<int> sortedSet = new SortedSet<int> { 3, 1, 2 };


🤔 Параллельные коллекции

1️⃣ ConcurrentDictionary<TKey, TValue>: Параллельная версия Dictionary, предназначенная для безопасного использования в многопоточных приложениях.
   ConcurrentDictionary<string, int> concurrentDict = new ConcurrentDictionary<string, int>();
concurrentDict.TryAdd("Alice", 30);


2️⃣ ConcurrentQueue<T>: Параллельная версия Queue.
   ConcurrentQueue<string> concurrentQueue = new ConcurrentQueue<string>();
concurrentQueue.Enqueue("first");


3️⃣ ConcurrentStack<T>: Параллельная версия Stack.
   ConcurrentStack<string> concurrentStack = new ConcurrentStack<string>();
concurrentStack.Push("first");


4️⃣ BlockingCollection<T>: Коллекция, поддерживающая операции добавления и извлечения с блокировкой и ограничением по емкости.
   BlockingCollection<int> blockingCollection = new BlockingCollection<int>(5);
blockingCollection.Add(1);


🤔 Краткий ответ

В C# есть множество коллекций для различных целей, включая List, Dictionary, HashSet, Queue, Stack, специализированные коллекции, такие как LinkedList, SortedList, и параллельные коллекции, такие как ConcurrentDictionary и BlockingCollection. Каждая коллекция имеет свои особенности и предназначена для определенных сценариев использования.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤔 Какой метод из перечисленных используется для преобразования строки в число?
Anonymous Quiz
65%
int.Parse()
12%
Convert.ToString()
4%
String.Convert()
20%
ToInt32()
📌 Что такое исключения?

💬 Спрашивают в 11% собеседований

Исключения в программировании — это механизмы обработки ошибок и необычных ситуаций, которые возникают во время выполнения программы. В C# и других языках программирования исключения позволяют отделить код обработки ошибок от основного кода программы, что упрощает его чтение и поддержку.

🤔 Основные понятия

1️⃣ Исключение (Exception): Событие, которое прерывает нормальный поток выполнения программы.

2️⃣ Блок try: Содержит код, который может вызвать исключение.

3️⃣ Блок catch: Содержит код, который выполняется, если возникает исключение. В catch блок можно передать параметр — экземпляр исключения, которое произошло.

4️⃣ Блок finally: Содержит код, который выполняется в любом случае, независимо от того, произошло исключение или нет. Обычно используется для освобождения ресурсов.

5️⃣ Бросание исключения (throw): Механизм для явного вызова исключения.

🤔 Пример использования

🤔 Основные блоки
try
{
// Код, который может вызвать исключение
int divisor = 0;
int result = 10 / divisor;
}
catch (DivideByZeroException ex)
{
// Обработка исключения
Console.WriteLine("Деление на ноль невозможно.");
}
finally
{
// Код, который выполнится в любом случае
Console.WriteLine("Блок finally выполнен.");
}


🤔 Создание и бросание собственного исключения
public class InvalidAgeException : Exception
{
public InvalidAgeException(string message) : base(message) { }
}

public void SetAge(int age)
{
if (age < 0)
{
throw new InvalidAgeException("Возраст не может быть отрицательным.");
}
// Логика установки возраста
}


🤔 Краткий ответ

Исключения — это механизм обработки ошибок в C#, позволяющий отделить код обработки ошибок от основного кода программы. Основные элементы включают блоки try, catch, finally, а также оператор throw для явного вызова исключений.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Что произойдет, если вызвать метод Equals() для двух различных объектов, которые содержат одинаковые данные?
Anonymous Quiz
22%
Метод вернет true, если данные равны
43%
Метод всегда вернет false
9%
Метод вызовет исключение
27%
Метод вернет true, если объекты идентичны
🤯12😁6🎉2
📌 Что такое параллелизм?

💬 Спрашивают в 11% собеседований

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

🤔 Основные концепции параллелизма

1️⃣ Параллельное выполнение (Parallel Execution): Одновременное выполнение нескольких задач на разных процессорных ядрах.

2️⃣ Потоки (Threads): Наименьшие единицы выполнения, которые могут быть параллельно выполнены.

3️⃣ Задачи (Tasks): Абстракция над потоками, позволяющая проще управлять параллельными операциями.

4️⃣ Асинхронное программирование (Asynchronous Programming): Выполнение операций без блокировки основного потока, часто используется в сочетании с параллелизмом.

🤔 Пример использования параллелизма в C#

🤔 С использованием `Parallel.For`
using System;
using System.Threading.Tasks;

class Program
{
static void Main()
{
Parallel.For(0, 10, i =>
{
Console.WriteLine($"Task {i} is running on thread {Task.CurrentId}");
});
}
}


🤔 С использованием `Task.Run`
using System;
using System.Threading.Tasks;

class Program
{
static async Task Main()
{
var task1 = Task.Run(() => DoWork("Task 1"));
var task2 = Task.Run(() => DoWork("Task 2"));

await Task.WhenAll(task1, task2);
}

static void DoWork(string taskName)
{
Console.WriteLine($"{taskName} is running on thread {Task.CurrentId}");
}
}


🤔 Основные библиотеки и пространства имен в C#

1️⃣ System.Threading.Tasks: Основное пространство имен для работы с задачами (Task) и параллельным выполнением.

2️⃣ System.Threading: Предоставляет классы и интерфейсы для работы с потоками и задачами низкого уровня.

3️⃣ Parallel LINQ (PLINQ): Расширение LINQ для параллельного выполнения запросов.

🤔 Преимущества параллелизма

1️⃣ Ускорение выполнения задач: Позволяет значительно уменьшить время выполнения вычислительно интенсивных задач.

2️⃣ Эффективное использование ресурсов: Максимально использует мощности многоядерных процессоров.

3️⃣ Масштабируемость: Обеспечивает более плавную работу приложений при увеличении нагрузки.

🤔 Краткий ответ

Параллелизм — это метод одновременного выполнения нескольких задач для ускорения процессов и эффективного использования ресурсов компьютера. В C# это реализуется через Parallel и Task классы, позволяя выполнять задачи на разных процессорных ядрах одновременно.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📌 Что такое асинхронное программирование?

💬 Спрашивают в 11% собеседований

Асинхронное программирование — это метод программирования, при котором выполнение задач не блокирует основной поток приложения. Это позволяет улучшить производительность и отзывчивость приложений, особенно при выполнении длительных операций, таких как ввод-вывод (I/O), сетевые запросы или взаимодействие с базами данных.

🤔 Основные концепции

1️⃣ Асинхронные методы: Методы, которые выполняются асинхронно, часто обозначаются ключевыми словами async и await в C#.

2️⃣ Task: Основная единица работы в асинхронном программировании в C#. Объект Task представляет собой операцию, которая может выполняться асинхронно.

3️⃣ Await: Оператор, который указывает на то, что выполнение метода должно ожидать завершения асинхронной операции.

4️⃣ I/O Bound: Операции, которые зависят от ввода-вывода и обычно требуют времени ожидания (например, сетевые запросы, чтение/запись файлов).

5️⃣ CPU Bound: Операции, которые требуют значительных вычислительных ресурсов процессора.

🤔 Преимущества асинхронного программирования

1️⃣ Повышенная производительность: Основной поток не блокируется при выполнении длительных операций.

2️⃣ Отзывчивость интерфейса: Приложения остаются отзывчивыми, даже при выполнении длительных операций.

3️⃣ Лучшее использование ресурсов: Асинхронные операции позволяют более эффективно использовать ресурсы системы.

🤔 Пример асинхронного программирования в C#

🤔 Асинхронный метод
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
string url = "https://api.example.com/data";
string result = await FetchDataAsync(url);
Console.WriteLine(result);
}

static async Task<string> FetchDataAsync(string url)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
return responseBody;
}
}
}


🤔 Объяснение кода

1️⃣ async: Ключевое слово, которое указывает, что метод является асинхронным. Методы Main и FetchDataAsync объявлены с async.

2️⃣ await: Оператор, который приостанавливает выполнение метода до завершения асинхронной операции. В методе FetchDataAsync await используется для ожидания завершения операций GetAsync и ReadAsStringAsync.

3️⃣ Task: Возвращаемый тип метода FetchDataAsync, представляющий асинхронную операцию, которая возвращает строку.

🤔 Асинхронное программирование с Task и Task<T>

🤔 Пример с Task
static async Task Main(string[] args)
{
await Task.Run(() => DoWork());
}

static void DoWork()
{
// Выполнение длительной операции
Console.WriteLine("Работа выполнена.");
}


🤔 Асинхронное программирование с I/O Bound операциями

🤔 Пример с чтением файла
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
string filePath = "example.txt";
string content = await ReadFileAsync(filePath);
Console.WriteLine(content);
}

static async Task<string> ReadFileAsync(string filePath)
{
using (StreamReader reader = new StreamReader(filePath))
{
return await reader.ReadToEndAsync();
}
}
}


🤔 Краткий ответ

Асинхронное программирование позволяет выполнять длительные операции без блокировки основного потока, улучшая производительность и отзывчивость приложений. В C# это реализуется с использованием ключевых слов async и await, а также класса Task.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
3
📌 Что такое паттерны проектирования?

💬 Спрашивают в 11% собеседований

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

🤔 Основные категории паттернов проектирования

1️⃣ Порождающие паттерны (Creational Patterns): Эти паттерны связаны с созданием объектов, что позволяет скрыть сложность создания объектов и повысить гибкость системы.

Примеры: Singleton, Factory Method, Abstract Factory, Builder, Prototype.

2️⃣ Структурные паттерны (Structural Patterns): Эти паттерны описывают, как классы и объекты могут быть объединены для формирования больших структур.

Примеры: Adapter, Composite, Proxy, Flyweight, Facade, Bridge, Decorator.

🤔 Примеры паттернов проектирования

🤔 Singleton (Порождающий паттерн)

Обеспечивает создание единственного экземпляра класса и предоставляет глобальную точку доступа к этому экземпляру.
public class Singleton
{
private static Singleton instance;

private Singleton() { }

public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}


🤔 Factory Method (Порождающий паттерн)

Определяет интерфейс для создания объекта, но позволяет подклассам изменить тип создаваемого объекта.
public abstract class Product { }

public class ConcreteProductA : Product { }

public class ConcreteProductB : Product { }

public abstract class Creator
{
public abstract Product FactoryMethod();
}

public class ConcreteCreatorA : Creator
{
public override Product FactoryMethod()
{
return new ConcreteProductA();
}
}

public class ConcreteCreatorB : Creator
{
public override Product FactoryMethod()
{
return new ConcreteProductB();
}
}


🤔 Adapter (Структурный паттерн)

Позволяет объектам с несовместимыми интерфейсами работать вместе.
public interface ITarget
{
void Request();
}

public class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("Specific request");
}
}

public class Adapter : ITarget
{
private readonly Adaptee _adaptee;

public Adapter(Adaptee adaptee)
{
_adaptee = adaptee;
}

public void Request()
{
_adaptee.SpecificRequest();
}
}


🤔 Observer (Поведенческий паттерн)

Определяет зависимость "один ко многим" между объектами таким образом, что при изменении состояния одного объекта все зависимые объекты оповещаются и обновляются автоматически.
public interface IObserver
{
void Update();
}

public class ConcreteObserver : IObserver
{
public void Update()
{
Console.WriteLine("Observer updated");
}
}

public class Subject
{
private readonly List<IObserver> observers = new List<IObserver>();

public void Attach(IObserver observer)
{
observers.Add(observer);
}

public void Detach(IObserver observer)
{
observers.Remove(observer);
}

public void Notify()
{
foreach (var observer in observers)
{
observer.Update();
}
}
}


🤔 Краткий ответ

Паттерны проектирования — это проверенные решения общих проблем в разработке программного обеспечения. Они делятся на три категории: порождающие (Singleton, Factory Method), структурные (Adapter, Composite) и поведенческие (Observer, Strategy). Использование паттернов улучшает структуру кода, делает его более читаемым и гибким.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3😁1
🤔 Какие встроенные типы делегатов существуют в C#?
Anonymous Quiz
81%
Action, Func, Predicate.
5%
List, Array, Dictionary.
9%
Event, Property, Method.
5%
Static, Virtual, Override.
📌 Какие есть паттерны проектирования?

💬 Спрашивают в 11% собеседований

Паттерны проектирования — это шаблоны для решения общих проблем при разработке ПО. Они делятся на три категории:

🤔 Порождающие (Creational)

Singleton: Один экземпляр класса.

Factory Method: Создание объектов через методы.

Abstract Factory: Семейства связанных объектов.

Builder: Пошаговое создание сложных объектов.

Prototype: Клонирование объектов.

🤔 Структурные (Structural)

Adapter: Преобразование интерфейсов.

Bridge: Разделение абстракции и реализации.

Composite: Деревья объектов.

Decorator: Добавление поведения объектам.

Facade: Упрощение интерфейсов.

Flyweight: Разделение мелких объектов.

Proxy: Заместитель объектов.

🤔 Поведенческие (Behavioral)

Observer: Оповещение об изменениях.

Strategy: Замена алгоритмов.

Command: Инкапсуляция запросов.

Iterator: Последовательный доступ.

Mediator: Посредник для взаимодействия.

State: Смена поведения в зависимости от состояния.

Chain of Responsibility: Цепочка обработчиков.

Visitor: Добавление операций к объектам.

Template Method: Скелет алгоритма.

🤔 Краткий ответ

Паттерны проектирования (порождающие, структурные, поведенческие) — это шаблоны для решения типовых задач в разработке ПО, улучшающие структуру и гибкость кода.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
📌 В чем отличие монолитной и микросервисной архитектуре на практике?

💬 Спрашивают в 11% собеседований

Монолитная и микросервисная архитектуры представляют собой два разных подхода к построению программных систем. Рассмотрим ключевые отличия между ними на практике:

🤔 Монолитная архитектура

Определение:

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

Особенности:

1️⃣ Единый код:

Вся логика и функциональность приложения собраны в одном проекте или исполняемом файле.

Пример: Веб-приложение, где UI, бизнес-логика и доступ к данным находятся в одном проекте.

2️⃣ Разработка и деплой:

Разработка может быть проще на начальном этапе, так как все компоненты находятся в одном проекте.

Деплой представляет собой единое целое: обновление требует полного перезапуска приложения.

3️⃣ Тестирование:

Процесс тестирования проще, так как все находится в одном проекте.

Тесты могут покрывать весь функционал приложения сразу.

4️⃣ Масштабирование:

Масштабирование происходит путем клонирования всего приложения (вертикальное масштабирование).

Ограничено возможностями одного сервера.

5️⃣ Связность:

Высокая степень связности между компонентами может привести к трудностям в поддержке и модификации.

Изменение одного компонента может потребовать пересмотра всего приложения.

🤔 Микросервисная архитектура

Определение:

Микросервисная архитектура разделяет приложение на множество небольших, независимых сервисов, каждый из которых выполняет свою конкретную задачу.

Особенности:

1️⃣ Разделение кода:

Логика приложения разделена на отдельные сервисы, каждый из которых может разрабатываться, тестироваться и деплоиться независимо.

Пример: Интернет-магазин с отдельными сервисами для управления товарами, заказами, платежами и пользователями.

2️⃣ Разработка и деплой:

Разработка может быть сложнее из-за необходимости координации между командами.

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

3️⃣ Тестирование:

Тестирование может быть сложнее, так как необходимо тестировать взаимодействие между сервисами.

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

4️⃣ Масштабирование:

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

Более гибкое и эффективное использование ресурсов.

5️⃣ Связность:

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

Изменение одного сервиса не требует изменения других, что уменьшает риск.

🤔 Пример на практике

Монолит:

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

Микросервисы:

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

🤔 Краткий ответ

Монолитная архитектура объединяет все компоненты приложения в одном проекте, что упрощает разработку и деплой, но усложняет масштабирование и поддержку. Микросервисная архитектура разделяет приложение на независимые сервисы, что улучшает масштабируемость и модульность, но усложняет координацию и тестирование.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😁1
СиШарпСНуляДоПрофи.docx
88.2 MB
Парень написал обширное руководство по C# в виде формата Word, которое охватывает все основные концепции языка С# включая парадигму ООП.

Руководство еще подлежит коррективам но вы сможете уже его использовать для обучения/ознакомления и зафиксировать основные моменты. Сам документ прикреплен ниже. Выглядит очень информативно 👍

Можете оставить фидбек в коментах, ну либо кто хочет помочь совместно закончить реализацию напишите ему: https://t.iss.one/vlar4x
🔥8
📌 Внешние ключи должны быть в базе данных?

💬 Спрашивают в 11% собеседований

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

🤔 Зачем нужны внешние ключи

1️⃣ Целостность данных:

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

Например, если у вас есть таблица Orders и таблица Customers, внешний ключ в Orders может ссылаться на первичный ключ в Customers, гарантируя, что каждый заказ относится к существующему клиенту.

2️⃣ Упрощение запросов:

Внешние ключи облегчают написание запросов SQL, которые объединяют данные из нескольких таблиц. Они обеспечивают логическую связь, которая позволяет объединять таблицы в запросах.

Пример: Получение всех заказов вместе с информацией о клиенте, сделавшем заказ.

3️⃣ Поддержка каскадных операций:

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

Пример: При удалении клиента можно настроить каскадное удаление всех его заказов.

4️⃣ Улучшение целостности данных:

Они предотвращают некорректные данные, такие как "висячие" ссылки, когда запись в одной таблице ссылается на несуществующую запись в другой таблице.

Пример: Невозможно добавить заказ в таблицу Orders, если нет соответствующего клиента в таблице Customers.

🤔 Как использовать внешние ключи

1️⃣ Создание внешнего ключа:

Внешний ключ создается при создании таблицы или добавляется позже с помощью команды ALTER TABLE.

Пример создания внешнего ключа при создании таблицы:
     CREATE TABLE Orders (
OrderID int PRIMARY KEY,
OrderDate datetime,
CustomerID int,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);


2️⃣ Добавление внешнего ключа в существующую таблицу:

Если таблица уже существует, внешний ключ можно добавить с помощью команды ALTER TABLE.

Пример:
     ALTER TABLE Orders
ADD CONSTRAINT FK_CustomerOrder
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);


3️⃣ Каскадные операции:

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

Пример настройки каскадного удаления:
     CREATE TABLE Orders (
OrderID int PRIMARY KEY,
OrderDate datetime,
CustomerID int,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
ON DELETE CASCADE
);


🤔 Примеры использования

🤔 Пример 1: Базовая установка внешнего ключа
CREATE TABLE Customers (
CustomerID int PRIMARY KEY,
CustomerName varchar(255)
);

CREATE TABLE Orders (
OrderID int PRIMARY KEY,
OrderDate datetime,
CustomerID int,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);


🤔 Пример 2: Каскадное удаление
CREATE TABLE Orders (
OrderID int PRIMARY KEY,
OrderDate datetime,
CustomerID int,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
ON DELETE CASCADE
);


🤔 Краткий ответ

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM