Considere o seguinte trecho de código em C#, que simula a execução de um escalonador de tarefas simples:

Considere também as seguintes modificações no código:
M1. Mover a lógica de rodízio, que atualmente está implementada no método “Main” da classe “MainClass” para dentro de um método “Schedule” na própria classe “MainClass”.
M2. Transformar o atributo “Tasks” da classe “TaskScheduler” de “public” para “private”.
M3. Transformar o atributo “NextTask” da classe “TaskScheduler” de “private” para “public”.
M4. Adicionar um construtor à classe “TaskScheduler”, que recebe como parâmetro o número de tarefas e inicializa o vetor de tarefas “Tasks”. Modificar o método “Main” da classe “MainClass” para utilizar esse construtor ao criar a instância “ts”.
M5. Transformar os métodos “SetNextTask” e “GetNextTask” de “public” para “private”.
M6. Adicionar um método na classe “TaskScheduler” que recebe como parâmetro um objeto do tipo “Task” e o adiciona ao vetor de tarefas “Tasks”. Utilizar esse método na classe “MainClass” para adicionar tarefas ao escalonador.
M7. Mover a lógica de rodízio, que atualmente está implementada na classe “MainClass” para dentro do método “GetCurrentTask” da classe “TaskScheduler”.
M8. Adicionar um construtor à classe “MainClass” , que recebe como parâmetro o número de tarefas e inicializa o vetor de tarefas “Tasks”. Modificar o método “Main” da classe “MainClass” para utilizar esse construtor e criar uma instância de “MainClass”.
M9. Remover os métodos “SetNextTask” e “GetCurrentTask” da classe “TaskScheduler”.
Qual das alternativas abaixo descreve um conjunto de modificações que, quando realizadas em conjunto, resulta em um código onde os princípios da orientação a objetos são mais bem aplicados?