Здравствуйте, IB, Вы писали:
IB>Вынужден констатировать, что и с упертостью борьбу я так же проиграл, мне уже стало не интересно. IB>По началу было, конечно, забавно ловить тебя на неуклюжих попытках интерпретировать все в свою пользу (чего, честно говоря не ожидал), но потом стало утомлять.
Да не кипятись ты так. Ведь тебя никто не заставляет отрекаться от твоего любимого правила проектирования, как инквизиция Галилео Галилея. А обращать неразумных крестом и мечом в собственную веру тоже не очень разумно.
Ты никогда не сталкивался с ситуацией когда есть успешный продукт (проект), а когда заглянешь в код, а там б^@ такое внутри... А код то работает.
В общем "Hakuna Matata".
Здравствуйте, <Аноним>, Вы писали:
А>Давайте вернемся к примеру о котором написал adontz. Есть наш класс String. У него есть методы LeftSubstring() и RightSubstring(). LeftSubstring() по правилу Бодягина оставлен в классе, т.к. использует внутренние данные класса, а метод RightSubstring() вынесен во внешний сервис.
Если тебе очень хочется обсудить конкретный пример, то ответ простой. Пример абсурден. Нет ни одного разумного обоснования, почему вдруг LeftSubstring нужен доступ к внутренним членам класса, а RightSubstring не нужен. В реальных строках, из-за жесткого требования к производительности, обе этих функции потребуют доступ к внутреннему буферу строки.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
Здравствуйте, stump, Вы писали:
S>Ты никогда не сталкивался с ситуацией когда есть успешный продукт (проект), а когда заглянешь в код, а там б^@ такое внутри... А код то работает.
И какой из этого следует вывод? Можно не тратить силы на проектирование, и писать так как показалось на первый взгляд удобнее?
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
Здравствуйте, AndrewVK, Вы писали:
А>>Давайте вернемся к примеру о котором написал adontz. Есть наш класс String. У него есть методы LeftSubstring() и RightSubstring(). LeftSubstring() по правилу Бодягина оставлен в классе, т.к. использует внутренние данные класса, а метод RightSubstring() вынесен во внешний сервис.
AVK>Если тебе очень хочется обсудить конкретный пример, то ответ простой. Пример абсурден. Нет ни одного разумного обоснования, почему вдруг LeftSubstring нужен доступ к внутренним членам класса, а RightSubstring не нужен. В реальных строках, из-за жесткого требования к производительности, обе этих функции потребуют доступ к внутреннему буферу строки.
AndrewVK, вместо решения конкретной решения задачи ты решил повоевать с её условиями? Я могу конкретизировать задачу примером кода. Надеюсь, теперь я услышу однозначный ответ, а то мне на одно мгновение показалось, что у тебя решения задачи нет, и в связи с этим тебе хочется выставить её абсурдной.
using System;
namespace AndrewVK_String
{
public class MyString
{
private char[] _data;
private int _length;
public MyString(char[] data)
{
this._data = data;
this._length = data.Length;
}
public MyString(char[] data, int length)
{
this._data = data;
this._length = length;
}
public MyString LeftSubstring(int symbolCount)
{
return new MyString(this._data, symbolCount);
}
public MyString MiddleSubstring(int offset, int symbolCount)
{
char[] data = new char[symbolCount];
Array.Copy(this._data, offset, data, 0, symbolCount);
return new MyString(data, symbolCount);
}
public int Length
{
get { return this._length; }
}
}
public class MyStringHelper
{
public static MyString RightSubstring(MyString value, int symbolCount)
{
return value.MiddleSubstring(value.Length - symbolCount, symbolCount);
}
}
public class Program
{
public static void Main(string[] args)
{
MyString str = new MyString(new char[] { 'a', 'b', 'c', 'd' });
MyString left = str.LeftSubstring(3);
MyString right = MyStringHelper.RightSubstring(str, 3);
}
}
}
Здравствуйте, MozgC, Вы писали:
MC>AndrewVK, вместо решения конкретной решения задачи ты решил повоевать с её условиями
Понимаешь, если выдумывать бредовые условия, то решения тоже будут бредовыми. Garbage in, garbage out.
MC>Я могу конкретизировать задачу примером кода.
Пример кода тоже бредовый.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
Здравствуйте, AndrewVK, Вы писали:
MC>>Я могу конкретизировать задачу примером кода. AVK>Пример кода тоже бредовый.
Можешь привести пример не бредового кода? А именно, реализацию методов LeftSubstring(), MiddleSubstring() и RightSubstring(), оперирующих с полями
private char[] _data;
private int _length;
Насколько я тебя понимаю, при правильной реализации этих методов (моя неправильная), описанной проблемы не возникает, и все три метода окажутся либо вне класса, либо внутри, причём, совершенно естественным образом. Очень прошу не полениться, не ссылаться на очевидность и всё же привести свой вариант исходного кода. Не думаю, что написание 20 простейших строк отнимет много времени.
Здравствуйте, MozgC, Вы писали:
MC>Можешь привести пример не бредового кода?
А зачем?
MC>Насколько я тебя понимаю, при правильной реализации этих методов (моя неправильная), описанной проблемы не возникает, и все три метода окажутся либо вне класса, либо внутри, причём, совершенно естественным образом.
Точно.
MC> Очень прошу не полениться, не ссылаться на очевидность и всё же привести свой вариант исходного кода. Не думаю, что написание 20 простейших строк отнимет много времени.
Приведу, как только пойму смысл сего деяния.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
Здравствуйте, AndrewVK, Вы писали:
MC>>Можешь привести пример не бредового кода? AVK>А зачем?
Во мне закралось сомнение в правильности моей позиции. Если ты не против поделиться знаниями и опытом, то исходный код был бы очень уместным учебным материалом и убедительным аргументом. Ты ведь не против поделиться знаниями и опытом, не так ли? Что тебе стоит привести правильный пример, в котором описанной выше проблемы не существует? Неужели это так сложно, что нужна какая-то особая мотивация, большая чем для всех тех сообщений, которые ты уже написал?
Здравствуйте, MozgC, Вы писали:
MC>Во мне закралось сомнение в правильности моей позиции. Если ты не против поделиться знаниями и опытом, то исходный код был бы очень уместным учебным материалом и убедительным аргументом. Ты ведь не против поделиться знаниями и опытом, не так ли? Что тебе стоит привести правильный пример, в котором описанной выше проблемы не существует? Неужели это так сложно, что нужна какая-то особая мотивация, большая чем для всех тех сообщений, которые ты уже написал?
Я пока что так и не понимаю, зачем тебе код. Очевидно, что самая эффективная реализация всех вариаций сабстрингов — прямое копирование нужного куска буфера в новую строку. И либо ты это копируешь в каждой вариации своих XxxSubstring, либо, если уж делаешь конструктор, то делай так чтобы можно было указывать startIndex, а не только диапазон, код от этого ни капельки не усложнится. И при таком раскладе все XxxSusbstring стоит сделать ввиде extension методов. В твоем же варианте какая то абсурдная смесь. Единственный смысл такого кода я пока вижу лишь в том, чтобы доказать свою правоту.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
Здравствуйте, AndrewVK, Вы писали:
MC>>Во мне закралось сомнение в правильности моей позиции. Если ты не против поделиться знаниями и опытом, то исходный код был бы очень уместным учебным материалом и убедительным аргументом. Ты ведь не против поделиться знаниями и опытом, не так ли? Что тебе стоит привести правильный пример, в котором описанной выше проблемы не существует? Неужели это так сложно, что нужна какая-то особая мотивация, большая чем для всех тех сообщений, которые ты уже написал? AVK>Я пока что так и не понимаю, зачем тебе код.
В данном топике было очень много недопонимания, из-за того что разные люди по разному додумывали наброски чужих решений. Код исключил бы элемент двусмысленности. Ты можешь его предоставить?
Здравствуйте, MozgC, Вы писали:
MC>В данном топике было очень много недопонимания, из-за того что разные люди по разному додумывали наброски чужих решений. Код исключил бы элемент двусмысленности.
Ага, зато код гарантированно переведет обсуждение из обсуждения принципа в обсуждение конкретного кода. Ты этого добиваешься?
MC> Ты можешь его предоставить?
На всякий случай, если вдруг ты начнешь говорить, что твоя реализация быстрее — она никуда не годится, так как без копирования массива в конструкторе у тебя не обеспечивается имьютабельность. В реальной нетовской строке такое копирование происходит.
public class String1
{
private readonly char[] _data;
public String1(char[] data, int startIndex, int length)
{
_data = new char[length];
Array.Copy(data, startIndex, _data, 0, length);
}
public String1 Substring(int startIndex, int length)
{
return new String1(_data, startIndex, length);
}
public int Length
{
get { return _data.Length; }
}
}
public static class String1Extensions
{
public static String1 LeftString(this String1 str, int length)
{
return str.Substring(0, length);
}
public static String1 RightString(this String1 str, int length)
{
return str.Substring(str.Length - length, length);
}
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
Здравствуйте, <Аноним>, Вы писали:
А>Давайте вернемся к примеру о котором написал adontz. Есть наш класс String. У него есть методы LeftSubstring() и RightSubstring(). LeftSubstring() по правилу Бодягина оставлен в классе, т.к. использует внутренние данные класса, а метод RightSubstring() вынесен во внешний сервис.
А>
class String
А>{
А> public String LeftSubstring(int symbolCount);
А>}
А>class StringService
А>{
А> public static String RightSubstring(String value, int symbolCount);
А>}
Начнем с того что я не понимаю чем могут такие методы отличаться. Я бы не парился и предоставил одну функциональность
public String LeftSubstring(String& from, int begin, int end);
Если же реализация подразумевает только создание двух типов подстринга тогда я бы действовал следующим образом.
1. Рассмотрел бы подробно создание нового класса String , может создание подстринга можно запихнуть в конструктор.
2. Рассмотрел бы эфективность создания с помощью публичных контрактов.
3. Один можно публичным а другой нет , долго бы думал о внесении первого в метод класса.
4. При вынесении создания в функцию или класс хелпер , пострался бы не давать функциональности похожие имена , чтобы на интуитивном уровне воспринималось отличие этих методов.
А в целом практически бесполезно говорить про дизайн класса пока не расмотрена его ответственность и не определенны методы сценарии использования.
А>По правилу Бодягина это правильно и нормально. Правильно ли я в данном случае применил правило или вы хотите что-то уточнить?
Понятия не имею , вам решать если вы знаете правило бодягина.
Если согласиться с реализацией , то вынос функции в класс хелпер выглядит довольно разумно , он явно не необходимая часть класса и работает именно как хелпер поверх реализации.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, minorlogic, Вы писали:
M>>MiddleSubstring забыл
AVK>Оно чем то должно отличаться от моего Substring?
Здравствуйте, Ziaw, Вы писали:
IB>>2. Все побочные эффекты изменения реализаций контролирует компилятор. Z>Может стоит ввести в язык новый модификатор метода который имеет доступ только к публичным членам?
А можно класс разбить на несколько сущностей внутри имплементации. Минимальный набор функциональности прячем вглубь, остальное реализуем публичным интерфейсом. Как вариант.
Здравствуйте, stump, Вы писали:
S> А обращать неразумных крестом и мечом в собственную веру тоже не очень разумно.
Да я все больше на разумных рассчитывал...
S>Ты никогда не сталкивался с ситуацией когда есть успешный продукт (проект), а когда заглянешь в код, а там б^@ такое внутри... А код то работает.
Ок, хорошая отмазка, слив засчитан..