Информация об изменениях

Сообщение Re[115]: Мнение: объектно-ориентированное программирование — от 15.11.2019 11:51

Изменено 15.11.2019 13:31 artelk

Re[115]: Мнение: объектно-ориентированное программирование —
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, artelk, Вы писали:

A>>Пожалуйста! Но я все же настаиваю, что для Хаскела тот факт, что возвращается именно трансформация, а не ее результат, не принципиален в вопросе о чистоте. Внутренняя гипотетическая функция transform там тоже чиста. Она детерминирована (весь Мир передается ей в качестве параметра) и не делает никаких сайд-эффектов (т.к. все ее "эффекты" вовсе не "сайд", а включены в возвращаемое значение).
S>Эмм, просто наше определение сайд-эффектов — это как раз взаимодействие с "миром".
S>В приведённом коде world играет чисто номинальное значение; в более строгом подходе (как я его понимаю) у нас нет класса Console.
S>У нас есть что-то типа
S>
S>public struct World
S>{
S>  private string[] _out;
S>  private string[] _in;
S>  private World(string[] in, string[] out)

S>  public World PutStr(string line)
S>  {
S>     var newOut = new string[_out.Count+1];
S>     Array.Copy(_out, newOut, _out.Count);
S>     newOut[_out.Count] = line;
S>     return new World(_in, newOut);
S>  }

S>  public (string, World) GetStr()
S>  {
S>     var newIn = new string[_in.Count-1];
S>     Array.Copy(_in, newIn, 1, _in.Count-1);
S>     return (_in[0], new World(newIn, _out);
S>  }
S>}
S>

S>Это, конечно, условно — но для иллюстрации поведения сойдёт.

Согласен. Но у меня World вообще internal, как в Хаскеле. Так что пишем мой вариант, а имеем ввиду ваш — главное, чтоб для вызывающего кода работало как ваш вариант.
Для клиенсткого кода нужно запретить использовать класс Console (и прочие I/O классы) напрямую, без нашей IO обертки, и вот мы уже на полпути к Хаскелу.

Впринципе, можно сделать World открытым.
(По сигнатурам и семантике идентично вашему, а в реализации другое.)
public struct World
{
  private World()

  public World PutStr(string line)
  {
     Console.WriteLine(line);
     return new World();
  }

  public (string, World) GetStr()
  {
     return (Console.ReadLine(), new World());
  }
}


При наличие хаскелообразного ленивого исполнителя (чтобы только одна ветка исполнения отрабатывала в рантайме), все будет так же чисто и стерильно.
Re[115]: Мнение: объектно-ориентированное программирование —
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, artelk, Вы писали:

A>>Пожалуйста! Но я все же настаиваю, что для Хаскела тот факт, что возвращается именно трансформация, а не ее результат, не принципиален в вопросе о чистоте. Внутренняя гипотетическая функция transform там тоже чиста. Она детерминирована (весь Мир передается ей в качестве параметра) и не делает никаких сайд-эффектов (т.к. все ее "эффекты" вовсе не "сайд", а включены в возвращаемое значение).
S>Эмм, просто наше определение сайд-эффектов — это как раз взаимодействие с "миром".
S>В приведённом коде world играет чисто номинальное значение; в более строгом подходе (как я его понимаю) у нас нет класса Console.
S>У нас есть что-то типа
S>
S>public struct World
S>{
S>  private string[] _out;
S>  private string[] _in;
S>  private World(string[] in, string[] out)

S>  public World PutStr(string line)
S>  {
S>     var newOut = new string[_out.Count+1];
S>     Array.Copy(_out, newOut, _out.Count);
S>     newOut[_out.Count] = line;
S>     return new World(_in, newOut);
S>  }

S>  public (string, World) GetStr()
S>  {
S>     var newIn = new string[_in.Count-1];
S>     Array.Copy(_in, newIn, 1, _in.Count-1);
S>     return (_in[0], new World(newIn, _out);
S>  }
S>}
S>

S>Это, конечно, условно — но для иллюстрации поведения сойдёт.

Согласен. Но у меня World вообще internal, как в Хаскеле. Так что пишем мой вариант, а имеем ввиду ваш — главное, чтоб для вызывающего кода работало как ваш вариант.
Для клиенсткого кода нужно запретить использовать класс Console (и прочие I/O классы) напрямую, без нашей IO обертки, и вот мы уже на полпути к Хаскелу.

Впринципе, можно сделать World открытым.
(По сигнатурам и семантике идентично вашему, а в реализации другое.)
public struct World
{
  private World()

  public World PutStr(string line)
  {
     Console.WriteLine(line);
     return new World();
  }

  public (string, World) GetStr()
  {
     return (Console.ReadLine(), new World());
  }
}


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