|
![]() |
#1 |
Участник
|
Цитата:
Чтобы иметь это в таком количестве надо делать крупные кусочки из мелких. Причем кусочки люого уровня должны иметь "снаружи" и "внутри" и снаружи быть проще чем внутри. PHP код:
X++: [Math]::Log(78843, 8) Но существующие объекты тоже достаточно жирные. Если посчитать строчки кода, то: X++: PS E:\RainMain\Source\AppIL\Metadata\ApplicationSuite> ls -Recurse -Include *.xml | %{ (gc $_.FullName).Length }| measure -sum | % sum 24284376 PS E:\RainMain\Source\AppIL\Metadata\ApplicationSuite> [Math]::Log(24284376, 8) 8.17784169341017 Цитата:
получается, что в неймспейсах класс - это что-то вроде группы свойств и методов, которые предназначены делать какую-то одну задачу.
Цитата:
в традиционной аксапте нет возможности группировать методы, а список классов бесконечный...
То есть у нас есть объекты приложения, модели, модули, причем отличить внутренне от внешнего можно только на уровне объектов приложения (да и то не всех). У модулей есть ключевое слово internal, но оно не работало для нас, например год назад полностью - не поддерживалось в VS и не было InternalsVisibleTo (что надо для юниттестов). Под классами есть методы, функции (которые не рекомендуется использовать). То есть нужно ~9 уровней а есть пять, причем, последние два воявились в 2012 и 7 и внутренности нельзя спрятать выше уровня класса. На уровне модуля хотя бы контроллируются зависимости и их нецикличность. Но мне кажется разница в восприятии в большей степени из-за разницы условий в которых работаем и бекграунда. |
|
![]() |
#2 |
Участник
|
Цитата:
Сообщение от belugin
![]() Кошелек Миллера - чтобы чем-то комфортно оперировать надо иметь это в количестве 7+-2.
Цитата:
![]() макс, ты сейчас продемонстрировал блестящий программистских подход. равномерно(!) разбивать на кусочки по 8(!) все(!) объекты аксапты никто не просил. убежден, что из всех читателей только у тебя такая мысль возникла )))) как только появляется слово "все" - жди логической ошибки. жжошь! Цитата:
Сообщение от belugin
![]() Это называется Single Responsibility Principle
SOLID - не священная книга. Эти принципы имеют свои области применения и имеют случаи, когда их не рекомендуется применять. Кроме того есть паттерн Фасад https://en.wikipedia.org/wiki/Facade_pattern и много других. собственно вопрос этой темы: почему один принцип, не слишком свойственный старой аксапте, упорно применяется в последних версиях. Цитата:
и вообще много чего было придумано. Цитата:
Потому что позиционировалась как "единая система", "единая база", "целостные и всегда актуальные данные". Кому нужно, Макс? Кому? И зачем? Какие свойства возникнут в системе после того, как эти уровни появятся, а какие свойства пропадут? Наверное... |
|
![]() |
#3 |
Участник
|
Цитата:
Цитата:
жжошь!
У тебя есть какая-то другая метрика для оценки коричества информации в коде? Цитата:
спасибо )
SOLID - не священная книга. Эти принципы имеют свои области применения и имеют случаи, когда их не рекомендуется применять. Цитата:
и суффиксы. и соглашения по наименованию объектов.
и вообще много чего было придумано. Цитата:
Потому что позиционировалась как "единая система", "единая база", "целостные и всегда актуальные данные".
Цитата:
Кому нужно, Макс?
Кому? И зачем? Какие свойства возникнут в системе после того, как эти уровни появятся, а какие свойства пропадут? |
|
![]() |
#4 |
Участник
|
Цитата:
Цитата:
а зачем такая метрика? Цитата:
знаю-знаю. но специально стараюсь не использовать терминологию в ВОПРОСАХ. выбор терминологии отвечающим позволяет многое узнать о его ходе мысли. вот я спросил про "ездач", а ты ответил одним из принципов в SOLID. а почему именно SOLID? почему не другие шаблоны и паттерны? почему спрашиваю? а потому что основным инструментом SOLID является рефакторинг кода. SOLID - это шаблон agile разработки. но: 1. майерософт выпущенный в релизе Аксапты код не рефакторит по соображениям совместимости. ))) 2. с точки зрения не-МС-программистов, набор классов в Аксапте является библиотекой. agile не очень подходит для разработки библиотек ))) ================== и вообще, если человек задает вопросы - это не значит что он не знает ответа. это значит, что он хочет узнать мнение другого человека. ) Цитата:
и в самом деле, причем тут это? |
|
![]() |
#5 |
Участник
|
Чтобы оценить потребное количество уровеней кусочков по 8 - см рассуждения выше.
Цитата:
а... ты об этом.
знаю-знаю. но специально стараюсь не использовать терминологию в ВОПРОСАХ. выбор терминологии отвечающим позволяет многое узнать о его ходе мысли. вот я спросил про "ездач", а ты ответил одним из принципов в SOLID. а почему именно SOLID? почему не другие шаблоны и паттерны? Цитата:
почему спрашиваю? а потому что основным инструментом SOLID является рефакторинг кода. SOLID - это шаблон agile разработки.
Цитата:
но:
1. майерософт выпущенный в релизе Аксапты код не рефакторит по соображениям совместимости. ))) Цитата:
2. с точки зрения не-МС-программистов, набор классов в Аксапте является библиотекой. agile не очень подходит для разработки библиотек )))
Цитата:
т.е. отсутствие инструментария...
и в самом деле, причем тут это? |
|
![]() |
#6 |
Участник
|
Цитата:
Цитата:
именно поэтому я сознательно не употреблял термин в вопросе. нет, конечно. во-первых, это только ООП. во-вторых, это часть agile. И еще вопрос - насколько agile применим в данном случае. "...которые означали пять основных принципов объектно-ориентированного программирования" "...Это часть общей стратегии гибкой и адаптивной разработки" https://ru.wikipedia.org/wiki/SOLID_...BD%D0%B8%D0%B5) english: "for five basic principles of object-oriented programming and design" "It is part of an overall strategy of agile and Adaptive Software Development" https://en.wikipedia.org/wiki/SOLID_...riented_design) Цитата:
так что же в аксапте можно рефакторить? в этой ветке обсуждалось семейство FormLetter - его можно? в этой ветке обсуждался runBase - его можно? Цитата:
но мне кажется, что я и так забил эфир в последнее время своими выступлениями. мне кажется, что читающим гораздо интереснее было бы узнать твое мнение, как разработчика МС. поэтому, давай сделаем вид, что маззи (Я действительно сожалею, что использовал термин в вопросе вместо того, чтобы задать вопрос про закрытый код на простом естественном языке) давай лучше поговорим о твоем мнении. итак, ты считаешь, что agile подходит и для библиотек. именно поэтому МС одновременно и закрывает код аксапты, и пропагандирует гибкую разработку. можешь чуть подробнее рассказать, как применять методики гибкого программирования тем, у кого нет доступа к коду? есть ли особенности? возвращаясь к теме, какие приемы на твой взгляд могут снизить сложность гибкой разработки в условиях закрытого кода? или ссылку, где это обсуждается? Последний раз редактировалось mazzy; 21.06.2017 в 11:15. |
|
![]() |
#7 |
Участник
|
Цитата:
Но если просто гигантские изменения будут, то это то же не приветствуется - требует обоснования (внутри версии). Цитата:
итак, ты считаешь, что agile подходит и для библиотек.
Цитата:
именно поэтому МС одновременно и закрывает код аксапты,
Цитата:
и пропагандирует гибкую разработку.
можешь чуть подробнее рассказать, как применять методики гибкого программирования тем, у кого нет доступа к коду? есть ли особенности? Как разрабатывать кастомизации в условиях того, что код приложения (AppSuite) закрыт, мне самому интересно. Наверное у людей которые сейчас общаются в Яммере больше опыта чем у меня в этом плане. Цитата:
возвращаясь к теме, какие приемы на твой взгляд могут снизить сложность гибкой разработки в условиях закрытого кода?
|
|
|
За это сообщение автора поблагодарили: mazzy (2). |
![]() |
#8 |
NavAx
|
Ну по этому вопросу, как раз, разночтений нет. Не встречал еще человека который считает что сваливать все объекты в одну кучу AOT, да еще и в одно пространство имен, это хорошее решение. Это как раз особенность AX по которой мало кто скучать будет.
__________________
Isn't it nice when things just work? |
|
![]() |
#9 |
Banned
|
Цитата:
Цитата:
Разница в восприятии не в условиях,а в результатах труда. Мой результат труда - удовлетворить потребности бизнеса клиента. Не код сам по себе, а результат его выполнения. Абстракции и улучшение - для меня это термины бизнес-процессов, не кода. Мне все равно какой код, хоть 2000 строк. Я прикладной программист. Код АX - это прикладной код. Системному программированию там делать нечего. Есть kernel, вот и улучшайте сборщик мусора. Оverengineering возможно потому что салон автомобиля перепутали с двигателем. |
|
|
За это сообщение автора поблагодарили: macklakov (5). |
![]() |
#10 |
Участник
|
Цитата:
Сообщение от ax_mct
![]() Разница в восприятии не в условиях,а в результатах труда. Мой результат труда - удовлетворить потребности бизнеса клиента. Не код сам по себе, а результат его выполнения. Абстракции и улучшение - для меня это термины бизнес-процессов, не кода. Мне все равно какой код, хоть 2000 строк. Я прикладной программист.
Для меня мало закончить задачу. Я всегда стараюсь сделать рефакторинг кода в тех классах, которые правлю. Если предстоит скопировать логику класса под какие-то свои цели, я смотрю как можно обобщить её, чтобы не было тупого дублирования. Возникает иерархия классов, происходит выделение общих методов в родительский класс. Дальше эту структуру становится намного легче использовать, добавляя туда полезный код. Естественно, я не делаю такого со стандартом, больше всего ошибок и проблем возникает с кодом компаний, внедряющих собственные решения. Если делается под заказ, то вся работа происходит в сжатые сроки, тут и автотесты писать некогда и рефакторинг проводить времени нет. Скорость без качества. Все конечно довольны, но радость недолго длится. Некоторые ошибки вылезают только лет через 5-7. Пример: Решили сделать загрузку данных батчем и раскидать в журналы по разным компаниям. Делали через changeCompany и runAs. А потом клиент удивляется, куда пропадает часть данных? Смотрим, вроде нормально, правильно... закоммитили транзакцию, блок смены компании закрыли. Только дальше в этом же методе идёт (внимание) удаление связанных данных, которое происходит уже в текущей компании. После этого я нахожу еще кучу классов, которые делают то же самое. Продублировали без зазрения совести. И никто не удосужился протестировать. Скопипастили и всё, мы - молодцы! Поэтому, удовлетворить потребности бизнеса - это еще не самое главное. Главное, чтобы бизнесу не пришлось платить столько же другому программисту, который будет за вами убирать. P.S. ax_mct, я заранее извиняюсь, т.к. не знаю насколько вы хороший и компетентный разработчик. Но ваш подход в целом мне не нравится.
__________________
// no comments |
|
|
За это сообщение автора поблагодарили: AP-1055D (-1), gl00mie (1), ta_and (4). |
![]() |
#11 |
Banned
|
Цитата:
Сообщение от dech
![]() ...
изменять функционал и добавлять новый все-таки с умом надо. Требовать хороших удобных инструментов любой может. А вот создавать иерархии наследования, выделять интерфейсы, оптимизировать запросы к БД, ускорять работу форм и отчетов не всякому под силу. Многие не задумываясь дублируют метод, или того хуже класс, набитый под завязку этим самым г*. Меняют 2 строчки и довольны. Для меня мало закончить задачу. Я всегда стараюсь сделать рефакторинг кода в тех классах, которые правлю. Если предстоит скопировать логику класса под какие-то свои цели, я смотрю как можно обобщить её, чтобы не было тупого дублирования. Возникает иерархия классов, происходит выделение общих методов в родительский класс. Дальше эту структуру становится намного легче использовать, добавляя туда полезный код. Естественно, я не делаю такого со стандартом ... Пример: Решили сделать загрузку данных батчем и раскидать в журналы по разным компаниям. Делали через changeCompany и runAs. А потом клиент удивляется, куда пропадает часть данных? Смотрим, вроде нормально, правильно... закоммитили транзакцию, блок смены компании закрыли. Только дальше в этом же методе идёт (внимание) удаление связанных данных, которое происходит уже в текущей компании. После этого я нахожу еще кучу классов, которые делают то же самое. Продублировали без зазрения совести. И никто не удосужился протестировать. Скопипастили и всё, мы - молодцы! ... Коллега, вы крайне опасный романтик программирования. Убеждение что дублирование это всегда плохо и надо создавать иерархии наследования, выделять интерфейсы, выделять общие методы в родительский класс и прочее в том (не SYS) коде к которому вы прикасаетесь - это тот самый студенческий максимализм. В описанном примере ошибка логики. То что этот же код продублирован - само по себе это ни плохо ни хорошо и может быть оправданно. По крайней мере в открытом коде где у вас есть возможности искать и находить. Из-за страха/неприятия перед дублированием кода создавать иерархии наследования, выделять интерфейсы, выделять общие методы в родительский класс - это как ни парадоксально звучит и есть overengineering. Использовать подобные средства надо тогда когда говорит здравый смысл, а не просто потому что повтор кода. У нас приложение не группа закрытых DLL, а открытый текст. И как правильно подметил Bobkov, повтор кода - может быть необходим для обеспечения независимости кода. Всегда есть аспекты тестирования, деплоймента, одновременной работы, сырость требований и прочее помимо чистого искуства. Ремесленные аспекты. "если менять то только в одном месте" - это постулат компьютерной науки не имеющий ничего общего с реальной инженерией. Неестественные абстракции, то есть те которые не отражают реальные вещи, - намного хуже чем повтор кода. Последний раз редактировалось ax_mct; 21.06.2017 в 22:10. |
|
|
За это сообщение автора поблагодарили: AP-1055D (3), DAX.Company (1). |
![]() |
#12 |
NavAx
|
Цитата:
Сообщение от dech
![]() Требовать хороших удобных инструментов любой может. А вот создавать иерархии наследования, выделять интерфейсы, оптимизировать запросы к БД, ускорять работу форм и отчетов не всякому под силу. Многие не задумываясь дублируют метод, или того хуже класс, набитый под завязку этим самым г*.
Ах, да! О чем это я! Нам же дали замечательную универсальную интеграцию с банками! Недоделанный SSIS. Тоже непростая техническая задачка, я вам скажу. Типа от нормального банка мы получим файл, для которого квалифицированный девелопер легко подправит XSLT и мы получим желанную интеграцию. Только вот бизнес, заразы такие, когда выбирают банк, почему-то не спрашивают, какому стандарту следуют их файлы, они смотрят на выбор и стоимость финансовых инструментов. И бизнес приходит в некоторую оторопь, когда оказывается что в каком нибудь копеешном бухгалтерском пакете все эти банки уже есть. А вот в AX партнер либо продает дополнительный пакет интеграции, нормально поддерживать который у них нет ресурсов, либо лихорадочно ищет человека, который знает и X++ и XSLT и еще в состоянии разобраться с дикими форматами банковских файлов.
__________________
Isn't it nice when things just work? |
|
|
За это сообщение автора поблагодарили: trud (1), AlGol (1). |
![]() |
#13 |
Участник
|
Цитата:
![]()
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
|
За это сообщение автора поблагодарили: Bobkov (1), dech (1). |
![]() |
#14 |
Участник
|
Цитата:
Соответственно примерно по таким же законам надо работать. Какой документ лучше, вот такой? Цитата:
Цитата:
У этих животных хвосты длинные
Если надо поддерживать всех животных (допустим добавить, что хвост покрыт шерстью), то изменение требует анализа всех вариантов. Если нас волнует только кенгуру нам проще найти поиском ее и уточнить какой хвост у него. Могут быть промежуточные варианты - например нас волнуют все, кроме кенгуру. Так же и фреймворки - например SysOperation эквивалентен разделу в начале документа, где написано: - бывают операции - у операций бывают параметры - если не сказано обратного, то надо : - загрузить параметры из SYsLastValue - спросить параметры согласно типам - сохранить их в SysLastValue - выполнить операцию Далее для конкретной операции описываются параметры (DataContract) и что она делается. Диалог, сохранение и восстановление уже описаны и не надо повторять. Не надо уточнять как работать с разными версиями (там хранится по именам). Если хочется, особенного, можно описать это или атрибутами или кодом в UI Builder. Описанные параметры и операцию можно использовать из других частей документа без дополнительных описаний. RunBase эквивалентен фразе в начале документа: "Есть операции, которые могут показывать диалог и запускаться. Как связаны "показать диалог" и "запуститься" я не знаю, так же операция может сохранить состояние и восстановить ее, как именно - лично дело каждой операции" То есть надо каждый раз повторять: метод main, диалог (создания и получения), сохранение и восстановление и работу с версиями (все же аккуратно поддерживают восстановление из старых версий в unpack, да?). Я вот конкретно иногда забывал добавить строчку в getFromDialog или копировал но не правил и от этого были ошибки. P.S. Это тут было? https://www.youtube.com/watch?v=GRr4xeMn1uU |
|
|
За это сообщение автора поблагодарили: ta_and (4). |
![]() |
#15 |
Участник
|
Цитата:
Если требования для изменений пойдут построчно (наиболее реалистичный вариант, IMHO), то удобнее будет документ с независимыми строками. Если же требования для изменений будут относиться ко всем строкам сразу (маловероятный вариант, IMHO), то удобнее окажется документ "У этих животных хвосты длинные". То есть, выбор варианта документа обусловлен нашим прогнозом на то, как в будущем пойдут требования для изменения проектируемой системы. И тут, о чудо, на практике часто оказывается, что копипаста совсем не так уныла как казалась, потому что она дает возможность вносить изменения независимо от других частей системы, что повышает надежность системы. IMHO, конечно ![]() |
|
|
За это сообщение автора поблагодарили: ax_mct (3), mazzy (2), Ace of Database (2). |
![]() |
#16 |
Участник
|
Цитата:
Цитата:
Если требования для изменений пойдут построчно (наиболее реалистичный вариант, IMHO), то удобнее будет документ с независимыми строками. Если же требования для изменений будут относиться ко всем строкам сразу (маловероятный вариант, IMHO), то удобнее окажется документ "У этих животных хвосты длинные".
Мне кажется тут первый список понятнее - ясно кто подчиняется общему умолчанию а кто нет. У этих животных хвосты длинные: - Лиса - Бобер - Кенгуру (кроме австралийских короткохвостых) - Собака - У лисы длинный хвост. - У бобра недлинный хвост. - Кенгуру имеет длинный хвост (кроме австралийских короткохвостых). - Такой же хвост и у собаки. Цитата:
То есть, выбор варианта документа обусловлен нашим прогнозом на то, как в будущем пойдут требования для изменения проектируемой системы.
В случае кода, мы можем тоже провести замену, или воспользоваться каким-нибудь инструментом для рефакторинга (рефакторинги начинающиеся с inline) Цитата:
И тут, о чудо, на практике часто оказывается, что копипаста совсем не так уныла как казалась, потому что она дает возможность вносить изменения независимо от других частей системы, что повышает надежность системы.
IMHO, конечно ![]() Я не против дублирования в принципе, просто оно должно быть обосновано. |
|
![]() |
#17 |
Участник
|
Цитата:
Сообщение от belugin
![]() Так же и фреймворки - например SysOperation эквивалентен разделу в начале документа, где написано:
- бывают операции - у операций бывают параметры - если не сказано обратного, то надо : - загрузить параметры из SYsLastValue - спросить параметры согласно типам - сохранить их в SysLastValue - выполнить операцию Далее для конкретной операции описываются параметры (DataContract) и что она делается. Диалог, сохранение и восстановление уже описаны и не надо повторять. Не надо уточнять как работать с разными версиями (там хранится по именам). Если хочется, особенного, можно описать это или атрибутами или кодом в UI Builder. и если в случае с RunBase это делается легко и просто, то в случае с SysOperation(где та-же видимость и метки задаются атрибутами) такая "простая" с виду модификация потребует кучу усилий т.е. люди которые делали RunBase продумывали такие вещи, модифицировать SysOperation же довольно сложно |
|
![]() |
#18 |
Участник
|
|
|
Теги |
sysoperation framework |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|