Проблема в том, что для получения газа надо тратить энергию, и кпд будет не 10-15% как у угля, а 0,1-1%. Вам оно надо? По экологии ударит куда как сильнее и результаты потомки еще будут расхлебывать.
Все это из разряда "экологически-чистых" автомобилей Тесла, кпд у которых не лучше, чем в ДВС, только в отличие от ДВС, который конкретно сейчас выделит Х углекислого газа — электромобиль сожрет энергии все на тот же Х (которая идет от тех самых теплых углесжигательных станций) + некоторая доля Х, требуемая для транспортировки, да еще при хранении утечки ЭЭ происходят во всех аккумуляторах. Я уже не говорю, что утилизировать использованный аккумулятор куда как сложнее, чем выхлопные газы, которые в худшем случае содержат небольшие примеси тяжелых металлов, от которых можно спастись обязав всех ставить фильтр на выхлопную трубу.
Попробуйте посчитать, что значит производить биотопливо в промышленных масштабах, а главное — откуда столько отходов взять? Вам потребуются тонны биоотходов (кто их сортировать будет?), что бы получить несколько кВт ЭЭ.
На 1/3 энергии от солнца и ветра нужно превратить огромные территории в зоны отчуждения похлеще Чернобыля, там вообще ничего не должно быть, совсем. К тому же на производство солнечных панелей нужно много ЭЭ, откуда ее брать? От солнечных панелей? У них КПД очень низок, а применять эти панели есть смысл только в солнечных широтах (тропики и экватор) и выдавать одна панель размером в 1 м2 будет пару Вт/ч.
Гидро-станции — вы представляете сколько нужно затопить территорий, что бы было 17% по всему миру?
ТЭЦ и АЭС занимают такой большой сегмент рынка ЭЭ в мире не из-за того, что какому-то политику что-то захотелось, а потому что это в разы дешевле, меньше вредит экологии планеты в целом (а не только в вашей любимой Хермании) и главное, что это все предсказуемо, планируемо. С солнечными панелями и ветряками у вас не только цена подскочит, но и упадет выработка энергии в среднем == убийство промышленности.
И не надо выдавать "экологически-чистые" технологии, спасающие экологию вашей страны за счет чьей-то другой, которая производит сырье для ваших "экологически-чистых" технологий.
Да вы хотя бы поинтересовались бы, что такое песочная мафия (Sand mafia), и какие законы принимают, что бы песок с пляжей не собирали.
Java — тоже растущий и развивающийся язык. Из-за более раннего старта, нежели шарп — имеет больше легаси кода и больший технический долг. У шарпа такое будет рано или поздно. Поэтому замедление в последние годы для меня не является чем-то из ряда вон выходящим.
То что полезные фичи вносятся в джаву не говорит о том, что шарп хорош.
К шарпу у меня только одна претензия, которая на корню пилит ее использование — отсутствие кросс-платформенности (mono — это не c#, а опенсорсная разработка никакого отношения к мелкософту не имеющая).
Валидатору требуется для проверки NamedValue 4 обязательных константных аргумента и доступ к данным, класса SequenceType.
Предлагаете, что лучше устанавливать внешний валидатор, когда процедура проверки одна и не меняется? И в принципе не может изменится?
С method-object получается более компактный код.
Есть другой вариант парсер конфигураций 1С. В зависимости от типа объекта в xml, необходимо выполнять свою логику, причем она отличается сильно, но общего очень много.
у базового класса тонна информации, вроде около 10 полей (как констант, так и изменяемых), все необходимы при анализе. Часть создается в процессе анализа.
Раньше весь код представлял из себя кашу разных методов с 5-6 аргументами как минимум, сейчас 3 аргумента максимум и весь код разбит на функциональные блоки — вот конфигурируется документ, вот загружается контент из xml, тут определяются типы.
Про быстродействие даже говорить не хочется, оно просто в разы выше.
Хотя важнее именно повышение читаемости кода.
Или лучше иметь один класс (который в принципе нельзя разбить на независимые друг от друга классы без создания нереального количества мусорного кода), и 100+ методов в нем?
Если не страшно, вот пример из реального, работающего проекта, в исходном виде 1500 строк:
Часть класса
final class MetaDataMapper
{
/**
Огромное количество констант
**/
MetaDataMapper( VirtualFile file, 1СDocument sdk, 1СDocument target, @Nullable Element root )
{
this.file = file;
this.sdk = sdk;
this.target = target;
this.root = root;
resolver = new OneCv8ClassResolver( target );
sourceFile = new SourceFileStub( file.getAbsoluteName().substring( 1 ), null );
dummyDeclareStatement = DeclareStatementModifier.dummy( file );
}
private final VirtualFile file;
private final SourceFileStub sourceFile;
private final 1СDocument sdk;
private final Element root;
private final 1СDocument target;
private final OneCv8ClassResolver resolver;
private final DeclareStatementModifier dummyDeclareStatement;
private ClassBuilder classBuilder;
private List<ClassBuilder> transformationClasses;
void mapElement()
{
if( file.getName().startsWith( "Subsystem." )
|| file.getName().startsWith( "WSReference." )
|| file.getName().startsWith( "CommonAttribute." ) )
return;
if( root.getTagName().equalsIgnoreCase( "Configuration" ) )
{
target.newClass( "System.Конфигурация.ЭтаКонфигурация" )
.parent( TYPE_CONFIGURATION )
.superClass( TYPE_CONFIGURATION.classReference() )
.declareStatement( asStatement( root ) )
.customData( ATTR_UUID, root.getAttribute( ATTR_UUID ) )
.build();
return;
}
Element properties = XmlUtils.getSingleElementOrDie( root, TAG_PROPERTIES );
Element innerInfo = XmlUtils.getSingleElementOrNull( root, TAG_INNER_INFO );
Element internalInfo = XmlUtils.getSingleElementOrNull( root, TAG_INTERNAL_INFO );
Element childObjects = XmlUtils.getSingleElementOrNull( root, TAG_CHILD_OBJECTS );
Element standardAttributes = XmlUtils.getSingleElementOrNull( properties, TAG_STANDARD_ATTRIBUTES );
resolveThisClass();
transformationClasses = new ArrayList<>();
if( innerInfo != null || internalInfo != null )
new ClassTransformer( innerInfo, internalInfo ).doTransform();
if( childObjects != null )
readChildren( childObjects, standardAttributes, classBuilder, transformationClasses );
if( properties != null && root.getTagName().equalsIgnoreCase( "Document" ) )
registerDocumentSpecials( properties );
notifyComplete();
}
void mapFormElement()
{
if( !root.getTagName().equalsIgnoreCase( "Form" ) )
throw new IllegalStateException();
resolveThisClass();
FormAttributeReader attributeReader = new FormAttributeReader( classBuilder, transformationClasses );
readFormAttrs( attributeReader, TAG_ATTRIBUTES, TAG_ATTRIBUTE );
readFormAttrs( attributeReader, TAG_PARAMETERS, TAG_PARAMETER );
Element elements = XmlUtils.getSingleElementOrNull( root, TAG_ELEMENTS );
if( elements != null )
new FormElementsReader( elements ).read();
Element commands = XmlUtils.getSingleElementOrNull( root, "Commands" );
if( commands != null )
new FormCommandsReader( XmlUtils.getChildren( commands, "Command" ), asStatement( commands ) ).read();
notifyComplete();
}
void mapPredefined()
{
if( !root.getTagName().equalsIgnoreCase( "predefinedData" ) )
throw new IllegalStateException();
resolveThisClass();
for( Element item : XmlUtils.getChildren( root, "item" ) )
{
String name = XmlUtils.getTextContentOrDie( item, "name" );
Element codeElement = XmlUtils.getSingleElementOrNull( item, "code" );
String attrType = null;
if( codeElement != null )
attrType = codeElement.getAttribute( "xsi:type" );
1CType type = StringUtils.isBlank( attrType )
? getFieldType( item, "type" )
: resolver.resolveType( Collections.singletonList( attrType ) );
classBuilder.field( name ).type( type ).declareStatement( asStatement( item ) ).build();
}
notifyComplete();
}
void mapTxtFile()
{
1CClassReference reference = resolver.buildClassStructure( file.getName() );
if( reference == null )
throw new IllegalStateException( "Unable to resolve class: " + file );
classBuilder = target
.editClass( reference )
.modifier( dummyDeclareStatement );
transformationClasses = new ArrayList<>();
new PlainClassTransformer().doTransform();
notifyComplete();
}
private void resolveThisClass()
{
1CClassReference reference = resolver.buildClassStructure( file.getName() );
if( reference == null )
throw new IllegalStateException( "Unable to resolve class: " + file.getName() );
classBuilder = target.editClass( reference );
Element properties = XmlUtils.getSingleElementOrNull( root, TAG_PROPERTIES );
if( !root.getTagName().equals( "predefinedData" ) )
classBuilder.declareStatement( asStatement( root ) )
.customData( ATTR_UUID, root.getAttribute( ATTR_UUID ) );
String tagName = root.getTagName();
if( FORMS.contains( tagName.toLowerCase() ) && isManagedForm() )
{
classBuilder.parent( TYPE_MANAGED_FORM )
.modifier( Modifiers.ENFORCE_PARENT_CLASS );
}
else if( properties != null && tagName.equalsIgnoreCase( "Constant" ) )
registerConstantValueField( properties );
else if( properties != null && tagName.equalsIgnoreCase( "SessionParameter" ) )
registerSessionParameter( properties );
}
private void notifyComplete()
{
classBuilder.build();
if( transformationClasses != null )
transformationClasses.forEach( ClassBuilder:: build );
}
private void registerDocumentSpecials( Node properties )
{
ClassBuilder newRegisterRecordsCollection = createRecordsCollection();
createSpecialFields( newRegisterRecordsCollection );
Element registerRecords = XmlUtils.getSingleElementOrNull( properties, "RegisterRecords" );
if( registerRecords != null )
for( Element element : XmlUtils.getChildren( registerRecords, "xr:item" ) )
registerDocumentSpecialMember( newRegisterRecordsCollection, element );
newRegisterRecordsCollection.build();
}
private void registerDocumentSpecialMember( ClassBuilder newRegisterRecordsCollection, Node element )
{
String typeName = element.getTextContent();
1CClassReference reference = resolver.buildClassStructure( typeName );
1CClass aClass = reference == null ? null : target.getClassOrNull( reference );
if( aClass == null )
log.warn( "Failed to resolve: " + typeName );
else
{
String name = aClass.getName();
String memberTypeName =
OneCv8Types.NAMESPACE + '.'
+ aClass.getParentClass().classReference().getName() + "НаборЗаписей." + name;
1CType memberType = OneCv8Types.parse( memberTypeName );
newRegisterRecordsCollection
.field( name )
.type( memberType )
.declareStatement( asStatement( element ) )
.buildField();
}
}
private void createSpecialFields( ClassBuilder newRegisterRecordsCollection )
{
1CType type = newRegisterRecordsCollection.getReference().to1CType();
for( ClassBuilder aClass : transformationClasses )
if( REF_DOCUMENT_OBJECT.equals( aClass.getSuperClass() ) )
aClass
.field( "Движения" )
.type( type )
.declareStatement( aClass.getDeclareStatement() )
.build();
}
@NotNull
private ClassBuilder createRecordsCollection()
{
1CClassReference newRegisterRecordsCollectionReference =
OneCv8Language.reference( REF_RECORDS_COLLECTION.getFullName() + '.' + classBuilder.getReference().getName() );
if( target.getClassOrNull( newRegisterRecordsCollectionReference ) == null )
return target.newClass( newRegisterRecordsCollectionReference )
.superClass( REF_RECORDS_COLLECTION )
.parent( REF_RECORDS_COLLECTION.to1CType() );
return target.editClass( newRegisterRecordsCollectionReference );
}
private void registerSessionParameter( Node properties )
{
ClassBuilder paramClassBuilder = target.editClass( REF_SESSION_PARAMETERS );
String name = Utils.getObjectName( properties );
1CType type = getFieldType( properties, TAG_TYPE );
paramClassBuilder
.field( name ).type( type ).declareStatement( asStatement( root ) ).build()
.build();
}
private void registerConstantValueField( Node properties )
{
1CType fieldType = getFieldType( properties, TAG_TYPE );
classBuilder.field( "Значение" )
.type( fieldType )
.declareStatement( asStatement( root ) )
.build();
}
private boolean isManagedForm()
{
Element properties = XmlUtils.getSingleElementOrNull( root, TAG_PROPERTIES );
String formType = properties == null ? null : XmlUtils.getTextContentOrNull( properties, "FormType" );
return "managed".equalsIgnoreCase( formType );
}
private void readFormAttrs( FormAttributeReader attributeReader, String tagName, String childTagName )
{
Element attributes = XmlUtils.getSingleElementOrNull( root, tagName );
if( attributes != null )
for( Element element : XmlUtils.getChildren( attributes, childTagName ) )
attributeReader.read( element );
}
private void readChildren( Node childObjects, @Nullable Node standardAttributes, ClassBuilder primaryClass, List<ClassBuilder> secondaryClasses )
{
AbstractChildReader classFieldReader = new ClassFieldReader( primaryClass, secondaryClasses );
AbstractChildReader tabularSectionReader = new TabularSectionReader( primaryClass, secondaryClasses );
AbstractChildReader commandReader = new CommandReader( primaryClass, secondaryClasses );
Collection<Element> children = XmlUtils.getChildren( childObjects );
for( Element child : children )
{
String tagName = child.getTagName();
if( ALLOWED_CLASS_FIELDS.contains( tagName.toLowerCase() ) )
classFieldReader.read( child );
else if( TAG_TABULAR_SECTION.equalsIgnoreCase( tagName ) )
tabularSectionReader.read( child );
else if( TAG_COMMAND.equalsIgnoreCase( tagName ) )
commandReader.read( child );
else if( !SKIPPED_CLASS_FIELDS.contains( tagName.toLowerCase() ) )
log.error( "Skipping child object of unknown type - " + tagName );
}
if( standardAttributes != null )
{
Collection<Element> attributes = XmlUtils.getChildren( standardAttributes );
StandardAttributeReader reader = new StandardAttributeReader( primaryClass, secondaryClasses );
attributes.forEach( reader:: readAttribute );
}
}
private 1CType getFieldType( Node properties, String typeTagName )
private IStatement asStatement( Node node )
private final class FormElementsReader
{
private final Element elements;
private final ClassBuilder elementsSubClass;
private final 1CClassReference parentClassReference;
private final Deque<1CClassReference> eventTypeSource = new LinkedList<>();
void read()
void read( Node elementsNode )
}
private final class FormCommandsReader
{
private final List<Element> commands;
private final ClassBuilder formCommands;
void read()
}
private final class FormAttributeReader extends AbstractChildReader
{
@Override
void read( Element element )
}
private final class SubTableAttributeReader extends AbstractChildReader
{
private final String className;
private final 1CType parentClass;
private final 1CClassReference pathToColumns;
@Override
void read( Element element )
}
private final class StandardAttributeReader
{
private static final String CUSTOM_DATA_KEY_ALIAS = "alias";
private final ClassBuilder primaryClass;
private final List<ClassBuilder> secondaryClasses;
void readAttribute( Element attribute )
}
private static final class AttributeTemplate
{
private String name;
private 1CType type;
private final Collection<Modifier> modifiers = new HashSet<>();
void addModifier( Modifier modifier )
void setType( 1CType type )
public void setName( String name )
String getName()
1CType getType()
Collection<Modifier> getModifiers()
}
private abstract class AbstractChildReader
{
private final ClassBuilder primaryClass;
private final Collection<ClassBuilder> secondaryClasses;
ClassBuilder getPrimaryClass()
Collection<ClassBuilder> getSecondaryClasses()
1CType getXmlFieldType( Node properties, boolean useClassType, String typeTagName )
abstract void read( Element element );
void forEachClass( Consumer<ClassBuilder> callback )
}
private final class ClassFieldReader extends AbstractChildReader
{
@Override
void read( Element element )
}
private final class TabularSectionReader extends AbstractChildReader
{
@Override
void read( Element element )
}
private final class CommandReader extends AbstractChildReader
{
@Override
void read( Element element )
}
private final class ParentMembersReplacer
{
private final ClassBuilder currentClass;
private final Collection<1CClassReference> typesToReplace;
private final 1CClass parent;
private boolean typeReplaced;
void copyMembersFromParent()
}
private class PlainClassTransformer
{
private ClassBuilder current;
void doTransform()
void doPrimaryClassTransformations()
void produceType( String name, @Nullable String uuid, Modifier declareStatementModifier )
void registerField( 1CClassReference classReference )
void registerSubClass( String subClassParentName )
}
private final class ClassTransformer extends PlainClassTransformer
{
private final Element innerInfo;
private final Element internalInfo;
@Override
void doTransform()
}
}
Внутренности вложенных классов вырезал специально.
Работает это быстрее, чем прошлая реализация примерно в 2-3 раза (из-за других оптимизаций получилось намного выше). Просто потому что стэк не нагружается избыточной и ненужной работой, не говоря о том, что методы стали не по 100-150 строк в среднем, а по 50 максимум.
И загрузка десятка тысяч файлов xml не за 5 минут осуществляется, а за <30 секунд.
А вы говорите, что вложенные классы никогда нельзя применять.
С вашим подходом и синглтон — это убогий костыль, за который надо сажать и отбирать диплом.
Может все дело в том, что применять надо уметь инструмент? Знать где оно применимо?
PS а с inner-классами вообще беда-беда… они отвратительно влияют на читабельность родительского класса и допустимы в основном тогда, когда являются банальным представлением данных без средств обработки этих данных. Ну т.е. конструктор и геттеры… ну и опционально — сеттеры.
Почитайте что такое method-object.
У вас 10 параметров у функции, 9 из них всегда константы, а функцию вы вызываете много раз в цикле.
Вынести в вложенный класс и у вас будет большой конструктор и вызов метода с одним параметром. Это экономит стек.
Уже в том месте, где изначальный метр превратился в 6,5617 фута.
Из-за вот таких вот приколов самолеты падали, потому что заправляли-заправляли, а топлива на половину пути. То что вам кажется некомпетентным может на деле оказаться необходимостью конкретного случая.
Мы не говорили по поводу написания ТЗ. Так же как и на том уроке по дифурам — вам уже дали ТЗ, оно уже существует. Обсуждать его нечего.
Вы пытаетесь дать себе больше степеней свободы, что бы не напрягаться и сделать побыстрее, в то время как иногда ваше "побыстрее" может стоить млрд баксов при внедрении, и все из-за того, что вы сочли, что заказчик некомпетентен. Угадайте, будут ли вас нанимать?
Я вижу вы спорщик знатный, поэтому откланяюсь. То, что до вас пытался донести я и еще один человек до меня — вы понять отказываетесь. Все время на "заказчиков-идиотов" указываете, только вот мир немного иначе устроен. Не ч/б.
Желаю вам успехов.
Превосходно. У вас есть GPU (или любой другой специализированный вычислитель) и необходимо решить задачу через матричные вычисления, но у вас же есть "свои" методы, которыми вы успешно решаете на CPU.
Это провал Карл! Ваше решение не оптимально!
Дифуры и физика — это всего лишь инструменты, так же как CPU и GPU. И нужно уметь пользоваться ими, а не показать, какой вы молодец. И замечу — способность видеть множество решений — это только плюс вам. Но решение обязано подпадать под ТЗ. Иначе вы подставляете человека.
Просто подумайте, у вас попросили отмерить 1 метр оптоволокна, но вы решили, что отмерить 2 фута будет проще. Как потом быть заказчику? Смысл именно в инструментах и стандартах.
Это относится к функциональным языкам — у них есть своя специфика, которая и позволяет обходить глобальные состояния… за счет глобальных монад. Да что уж, предлагаю пойти дальше — класс, функция — это тоже глобальный объект, в своем роде. Только вот их глобальность скрыта ЯП и не доступна, обычно, программисту. Хотя умельцы патчат классы в рантайме прямо в виртуалке при загрузке этих классов — AspectJ как пример.
И да, как решение для ликвидации глобального состояния — ФОП отличное решение.
А в остальных случаях как? Или идеализм и перфекционизм вездесущи и все строем должны идти учить хаскель?
Ты решение из другой сферы взял, и при этом не достиг цели.
Вот если бы ты в контексте дифуров придумал свое решение, пусть даже менее элегантное — это было бы круто.
Ваш вариант — это в соревновании бега в мешках пробить в нем дно и бежать.
Решение не подпадает под заданную цель. Считайте это как ТЗ.
В целом же, в абстрактном случае, получи вы такую же задачу с просьбой решить — ваше решение было бы как раз самым правильным, потому что дифуры — это микроскопом гвозди забивать, когда есть более простое и доступное решение.
Где же в вашем первоначальном комментарии "правильно, как учили"?
В свое время так же занимался правкой багов во freecol. Одновременно писал к нему новый ИИ, который бы никогда не закончил.
Пока писал ИИ, с его помощью нашел баг в сервере.
В целом помощь в рефакторинге, исправил пару багов в клиенте и один в сервере.
Вроде бы участвовал только пару месяцев, зато очень хорошо помогло войти в курс дела разработки на Java. По времени ушло где-то 80 часов рабочего времени летом, а опыт использую до сих пор.
Если хотите чему-то научиться — ставьте себе невыполнимые задачи и шаг за шагом ее реализуйте. А опенсорс для этого самое лучшее начало. Гнаться за деньгами вот так вот сразу — бесперспективно. В любой области.
Допустим, что убираем checked. Вообще никаких исключений не видно, которые мог бы выбросить фреймворк, например для работы с http.
Что именно ловить? Checked исключения — это вариант возвращаемого значения с приятным бонусом в виде неявного завершения блока кода, вместо проверок возвращаемого методом кода (результата) — ловишь исключение. Это не только код упрощает, но и избавляет от нужды читать список констант (почему все упало) и пользоваться какими-то левыми инструментами, что бы получить детали.
А насчет заворачивания исключений многократно могу лишь сказать так: руки кривые и излишнее проектирование. Не каждый уровень бизнес-логики вообще требует какой-либо работы с исключениями.
Исключения не везде нужны. В лучшем случае в 1% функционала его требует обязательно, все остальное — проектирование ради проектирования.
Вот чего не хватает в Java, так это возможности сказать, что любые исключения в этом методе считать unchecked — как раз избавится от ручного управления списком throws. Современные IDE и компиляторы вполне умны, что бы понять какое исключение может быть в вызываемом методе и передать его выше. Для этого вроде как даже Java Reflections достаточно, информация присутствует.
Но для этого же существует суффикс при определении метода: throws И не нужно тогда ничего обрабатывать, при этом верхние уровни абстракции получат всю информацию о том, что использует ваша библиотека.
Насчет использования исключений в стиле goto не совсем согласен (ошибка 4), есть % тех случаев, которые просто требуют именно выброса исключений.
Как пример: Вы трассируете некую структуру данных (предположительно неограниченную — граф, дерево или список списков) и создаете собственную структуру данных с ограничением: не более N узлов.
Делать постоянные проверки на останов — снижение быстродействия более чем в 10 раз (такой код уже не будет оптимизироваться JIT даже если вы гуру в Java), не говоря о значительной потере читаемости такого кода, в котором везде и всюду if-else натыканы. С исключениями работает почти мгновенно. Разумеется исключение должно при этом иметь адекватное название, например TraceNodeLimitExceededException.
Так что ошибка 4 является ошибкой далеко не всегда.
Правильнее было бы назвать — рекомендация: "Не используйте исключения для управления ходом исполнения приложения, если нет значительной потери в быстродействии или читаемости кода."
Нет смысла лишать себя возможности сразу прекратить выполнение целого блока кода, если это позволит сделать код читаемым и не пестрить везде и всюду проверками.
Бывают, конечно. Но зачем туда идти если есть возможность пойти в нормальную организацию? И нервы сохраняться, опыт сразу пойдет и по деньгам будет веселее. Гугл + голова зачастую помогает не пойти работать в болото.
Асоциальность и не туда затянуть может. Вы недооцениваете степень замкнутости людей и неспособность (нежелание?) понимать окружающих.
Не знаю никаких проблем с самоуважением. А рвать в гугл только ради престижа? Деньги? Иммигрировать? Личная жизнь? Вы о чем?
Ну пока учился можно хоть эникейщиком, хоть дворником в ИТ фирме работать, если других предложений нет (да студентов берут часто не охотно). Но вы предлагаете выпускнику идти целенаправлено в болото?
А зачем работать эникейщиком? Руки марать в пыли? К моменту поступления в институт я уже хорошо программировал. Лучше, чем 80% выпускников этого же ВУЗа. Но обучался-то один. Инет появился поздно. Книжка Попова по паскалю и дельфи-хелп + позже мсдн с msvs 2006-2008 где-то урвал. По ним и учился. Были еще книжки что-то в духе 50 приемов чего-то там от Майерса.
Маленькая зарплата — это так же и возможности. Просто взять и например послать начальника в пешее путешествие. Взять и сделать по своему… и еще и оказаться правым. Что бы управлять людьми не обязательно быть руководителем. Хотя по началу я себя очень скромно вел. Очень. Пока не начал понимать что к чему и как да почему.
Кому болото — трата времени и сил, а кому песочница, которую будешь крутить как захочешь (денег же не платят, а люди пассивны довольно, кроме слов и ругани ничего не сделают). Да — ненависти огребешь по полной. Но увольнять тебя принципиально не будут, причины же очевидны, напротив — с огромным трудом уволишься.
Зато поворошив это все поймешь как оно детально работает и почему (или наоборот почему не работает).
В гугле таких же болот хватает, только там ты будешь винтиком и система в целом сложнее, что бы ее изучать без подготовки. А то и вовсе никогда не поймешь как оно получилось именно так. И потерять можно не 1-2 года, а лет 10.
А прыгать с одной работы на другую, только потому что на новой больше предлагают? Иметь трудовую, забитую под завязку записями в 1 год? Зачем?
Я уже видел резюме людей, у которых 10 раз работа поменялась за 7 лет… Как жить-то, если ты сам болото?
мне не помешало с зп в 30к перейти в коммерцию и зарабатывать 120к.
Тут вопрос что ты делаешь в "болоте", тухнешь или пытаешься что-то изменить. Хотя бы себя.
Но разумеется для каждого свое.
И да, работал в этих предприятиях пока учился.
И вы очень сильно ошибаетесь. Такие же "болота" и в коммерции бывают. Причем чаще, чем кажется и им для этого не нужны приставки "НИИ" или "НИЦ".
Пока устраивался на новую работу повидался за 5 собеседований на эти зоопарки.
для начинающего программиста часто опасно "заразиться" ленью и разгильдяйством
Обычно для этого нужна почва. Сами по себе люди не становятся лентяями и разгильдяями. Если с детства к аккуратности и трудолюбию приучили — избавится сложно.
Я учил многих в коммерческой фирме. Это обычно окупается, так как специалист вырастает во много раз быстрее. Так что сильно зависит от фирмы, в некоторых наоборот будут стараться чтобы не научился, потому что им нужны манкидевелоперы за копейки, а опытных разработчиков хватает.
Проблема в том, что единицы не задают общий формат. А надеяться на чудеса — опрометчиво.
Манкидевелоперы обычно у не очень способных руководителей, коих более чем достаточно. А удержать опытного разработчика бывает сложно.
Вот что бы точно опознавать этих "неспособных" руководителей — и нужно идти работать в НИИ на пару лет, лучше еще во время учебы на полставки — посмотреть на них в живую. Только не надо этого делать с устоявшимся мнением, что там все такие — цель понять как одних от других отделять. Будет ощущение, что потерял время, зато прививка на всю жизнь. С ходу этих "эффективных" будешь распознавать. Это не только куроводителей касается. Вообще всего спектра специальностей ИТ.
А низкая зарплата только в масть в этом случае.
А теперь попробуй в коммерции, когда работать приходится очень много, заниматься такой социальной инженерией. Долго протянешь? Зарплату тебе не за исследование фирмы дают.
Проблема в том, что для получения газа надо тратить энергию, и кпд будет не 10-15% как у угля, а 0,1-1%. Вам оно надо? По экологии ударит куда как сильнее и результаты потомки еще будут расхлебывать.
Все это из разряда "экологически-чистых" автомобилей Тесла, кпд у которых не лучше, чем в ДВС, только в отличие от ДВС, который конкретно сейчас выделит Х углекислого газа — электромобиль сожрет энергии все на тот же Х (которая идет от тех самых теплых углесжигательных станций) + некоторая доля Х, требуемая для транспортировки, да еще при хранении утечки ЭЭ происходят во всех аккумуляторах. Я уже не говорю, что утилизировать использованный аккумулятор куда как сложнее, чем выхлопные газы, которые в худшем случае содержат небольшие примеси тяжелых металлов, от которых можно спастись обязав всех ставить фильтр на выхлопную трубу.
Попробуйте посчитать, что значит производить биотопливо в промышленных масштабах, а главное — откуда столько отходов взять? Вам потребуются тонны биоотходов (кто их сортировать будет?), что бы получить несколько кВт ЭЭ.
На 1/3 энергии от солнца и ветра нужно превратить огромные территории в зоны отчуждения похлеще Чернобыля, там вообще ничего не должно быть, совсем. К тому же на производство солнечных панелей нужно много ЭЭ, откуда ее брать? От солнечных панелей? У них КПД очень низок, а применять эти панели есть смысл только в солнечных широтах (тропики и экватор) и выдавать одна панель размером в 1 м2 будет пару Вт/ч.
Гидро-станции — вы представляете сколько нужно затопить территорий, что бы было 17% по всему миру?
ТЭЦ и АЭС занимают такой большой сегмент рынка ЭЭ в мире не из-за того, что какому-то политику что-то захотелось, а потому что это в разы дешевле, меньше вредит экологии планеты в целом (а не только в вашей любимой Хермании) и главное, что это все предсказуемо, планируемо. С солнечными панелями и ветряками у вас не только цена подскочит, но и упадет выработка энергии в среднем == убийство промышленности.
И не надо выдавать "экологически-чистые" технологии, спасающие экологию вашей страны за счет чьей-то другой, которая производит сырье для ваших "экологически-чистых" технологий.
Да вы хотя бы поинтересовались бы, что такое песочная мафия (Sand mafia), и какие законы принимают, что бы песок с пляжей не собирали.
Тссс, парень, первое правило либералов — никогда не говорить про жертвы
репрессийхалатности либеральной политики.Java — тоже растущий и развивающийся язык. Из-за более раннего старта, нежели шарп — имеет больше легаси кода и больший технический долг. У шарпа такое будет рано или поздно. Поэтому замедление в последние годы для меня не является чем-то из ряда вон выходящим.
То что полезные фичи вносятся в джаву не говорит о том, что шарп хорош.
К шарпу у меня только одна претензия, которая на корню пилит ее использование — отсутствие кросс-платформенности (mono — это не c#, а опенсорсная разработка никакого отношения к мелкософту не имеющая).
Проблемы обратной совместимости шарпа (первая выдача гугла):
https://docs.microsoft.com/ru-ru/dotnet/framework/migration-guide/version-compatibility
Для джавы подобного не замечал, хотя переводил большой проект с 6 на 7, а затем и на 8.
На лохивар не затянете, сударь.
Их и там достаточно. Не говоря о том, что совместимость между версиями почти полностью отсутствует.
Каждый инструмент обладает своими достоинствами и недостатками. Как инженер вы должны их видеть и применять тогда, когда эффект будет максимален.
А кивать на костыли только ради перфекционизма… интересный выбор, но Ынтырпрайз держится на решении задач, а не написании кода.
Как пример: https://github.com/lastrix/asn1s/blob/master/asn1s-core/src/main/java/org/asn1s/core/type/x680/collection/SequenceType.java
Валидатору требуется для проверки NamedValue 4 обязательных константных аргумента и доступ к данным, класса SequenceType.
Предлагаете, что лучше устанавливать внешний валидатор, когда процедура проверки одна и не меняется? И в принципе не может изменится?
С method-object получается более компактный код.
Есть другой вариант парсер конфигураций 1С. В зависимости от типа объекта в xml, необходимо выполнять свою логику, причем она отличается сильно, но общего очень много.
у базового класса тонна информации, вроде около 10 полей (как констант, так и изменяемых), все необходимы при анализе. Часть создается в процессе анализа.
Раньше весь код представлял из себя кашу разных методов с 5-6 аргументами как минимум, сейчас 3 аргумента максимум и весь код разбит на функциональные блоки — вот конфигурируется документ, вот загружается контент из xml, тут определяются типы.
Про быстродействие даже говорить не хочется, оно просто в разы выше.
Хотя важнее именно повышение читаемости кода.
Или лучше иметь один класс (который в принципе нельзя разбить на независимые друг от друга классы без создания нереального количества мусорного кода), и 100+ методов в нем?
Если не страшно, вот пример из реального, работающего проекта, в исходном виде 1500 строк:
Внутренности вложенных классов вырезал специально.
Работает это быстрее, чем прошлая реализация примерно в 2-3 раза (из-за других оптимизаций получилось намного выше). Просто потому что стэк не нагружается избыточной и ненужной работой, не говоря о том, что методы стали не по 100-150 строк в среднем, а по 50 максимум.
И загрузка десятка тысяч файлов xml не за 5 минут осуществляется, а за <30 секунд.
А вы говорите, что вложенные классы никогда нельзя применять.
С вашим подходом и синглтон — это убогий костыль, за который надо сажать и отбирать диплом.
Может все дело в том, что применять надо уметь инструмент? Знать где оно применимо?
Почитайте что такое method-object.
У вас 10 параметров у функции, 9 из них всегда константы, а функцию вы вызываете много раз в цикле.
Вынести в вложенный класс и у вас будет большой конструктор и вызов метода с одним параметром. Это экономит стек.
Уже в том месте, где изначальный метр превратился в 6,5617 фута.
Из-за вот таких вот приколов самолеты падали, потому что заправляли-заправляли, а топлива на половину пути. То что вам кажется некомпетентным может на деле оказаться необходимостью конкретного случая.
Мы не говорили по поводу написания ТЗ. Так же как и на том уроке по дифурам — вам уже дали ТЗ, оно уже существует. Обсуждать его нечего.
Вы пытаетесь дать себе больше степеней свободы, что бы не напрягаться и сделать побыстрее, в то время как иногда ваше "побыстрее" может стоить млрд баксов при внедрении, и все из-за того, что вы сочли, что заказчик некомпетентен. Угадайте, будут ли вас нанимать?
Я вижу вы спорщик знатный, поэтому откланяюсь. То, что до вас пытался донести я и еще один человек до меня — вы понять отказываетесь. Все время на "заказчиков-идиотов" указываете, только вот мир немного иначе устроен. Не ч/б.
Желаю вам успехов.
Превосходно. У вас есть GPU (или любой другой специализированный вычислитель) и необходимо решить задачу через матричные вычисления, но у вас же есть "свои" методы, которыми вы успешно решаете на CPU.
Это провал Карл! Ваше решение не оптимально!
Дифуры и физика — это всего лишь инструменты, так же как CPU и GPU. И нужно уметь пользоваться ими, а не показать, какой вы молодец. И замечу — способность видеть множество решений — это только плюс вам. Но решение обязано подпадать под ТЗ. Иначе вы подставляете человека.
Просто подумайте, у вас попросили отмерить 1 метр оптоволокна, но вы решили, что отмерить 2 фута будет проще. Как потом быть заказчику? Смысл именно в инструментах и стандартах.
Это относится к функциональным языкам — у них есть своя специфика, которая и позволяет обходить глобальные состояния… за счет глобальных монад. Да что уж, предлагаю пойти дальше — класс, функция — это тоже глобальный объект, в своем роде. Только вот их глобальность скрыта ЯП и не доступна, обычно, программисту. Хотя умельцы патчат классы в рантайме прямо в виртуалке при загрузке этих классов — AspectJ как пример.
И да, как решение для ликвидации глобального состояния — ФОП отличное решение.
А в остальных случаях как? Или идеализм и перфекционизм вездесущи и все строем должны идти учить хаскель?
Ты решение из другой сферы взял, и при этом не достиг цели.
Вот если бы ты в контексте дифуров придумал свое решение, пусть даже менее элегантное — это было бы круто.
Ваш вариант — это в соревновании бега в мешках пробить в нем дно и бежать.
Решение не подпадает под заданную цель. Считайте это как ТЗ.
В целом же, в абстрактном случае, получи вы такую же задачу с просьбой решить — ваше решение было бы как раз самым правильным, потому что дифуры — это микроскопом гвозди забивать, когда есть более простое и доступное решение.
Где же в вашем первоначальном комментарии "правильно, как учили"?
Не всегда.
Вы представляете себе, чем бы являлись системы логгирования, будь они строго локальны? Т.е. инициализация происходила бы на каждый класс?
Второе имя гениальности — краткость, первое — новизна.
В свое время так же занимался правкой багов во freecol. Одновременно писал к нему новый ИИ, который бы никогда не закончил.
Пока писал ИИ, с его помощью нашел баг в сервере.
В целом помощь в рефакторинге, исправил пару багов в клиенте и один в сервере.
Вроде бы участвовал только пару месяцев, зато очень хорошо помогло войти в курс дела разработки на Java. По времени ушло где-то 80 часов рабочего времени летом, а опыт использую до сих пор.
Если хотите чему-то научиться — ставьте себе невыполнимые задачи и шаг за шагом ее реализуйте. А опенсорс для этого самое лучшее начало. Гнаться за деньгами вот так вот сразу — бесперспективно. В любой области.
Допустим, что убираем checked. Вообще никаких исключений не видно, которые мог бы выбросить фреймворк, например для работы с http.
Что именно ловить? Checked исключения — это вариант возвращаемого значения с приятным бонусом в виде неявного завершения блока кода, вместо проверок возвращаемого методом кода (результата) — ловишь исключение. Это не только код упрощает, но и избавляет от нужды читать список констант (почему все упало) и пользоваться какими-то левыми инструментами, что бы получить детали.
А насчет заворачивания исключений многократно могу лишь сказать так: руки кривые и излишнее проектирование. Не каждый уровень бизнес-логики вообще требует какой-либо работы с исключениями.
Исключения не везде нужны. В лучшем случае в 1% функционала его требует обязательно, все остальное — проектирование ради проектирования.
Вот чего не хватает в Java, так это возможности сказать, что любые исключения в этом методе считать unchecked — как раз избавится от ручного управления списком throws. Современные IDE и компиляторы вполне умны, что бы понять какое исключение может быть в вызываемом методе и передать его выше. Для этого вроде как даже Java Reflections достаточно, информация присутствует.
Но для этого же существует суффикс при определении метода: throws И не нужно тогда ничего обрабатывать, при этом верхние уровни абстракции получат всю информацию о том, что использует ваша библиотека.
Насчет использования исключений в стиле goto не совсем согласен (ошибка 4), есть % тех случаев, которые просто требуют именно выброса исключений.
Как пример: Вы трассируете некую структуру данных (предположительно неограниченную — граф, дерево или список списков) и создаете собственную структуру данных с ограничением: не более N узлов.
Делать постоянные проверки на останов — снижение быстродействия более чем в 10 раз (такой код уже не будет оптимизироваться JIT даже если вы гуру в Java), не говоря о значительной потере читаемости такого кода, в котором везде и всюду if-else натыканы. С исключениями работает почти мгновенно. Разумеется исключение должно при этом иметь адекватное название, например TraceNodeLimitExceededException.
Так что ошибка 4 является ошибкой далеко не всегда.
Правильнее было бы назвать — рекомендация: "Не используйте исключения для управления ходом исполнения приложения, если нет значительной потери в быстродействии или читаемости кода."
Нет смысла лишать себя возможности сразу прекратить выполнение целого блока кода, если это позволит сделать код читаемым и не пестрить везде и всюду проверками.
На эльфах держится Objective-C объектная надстройка.
Асоциальность и не туда затянуть может. Вы недооцениваете степень замкнутости людей и неспособность (нежелание?) понимать окружающих.
Не знаю никаких проблем с самоуважением. А рвать в гугл только ради престижа? Деньги? Иммигрировать? Личная жизнь? Вы о чем?
А зачем работать эникейщиком? Руки марать в пыли? К моменту поступления в институт я уже хорошо программировал. Лучше, чем 80% выпускников этого же ВУЗа. Но обучался-то один. Инет появился поздно. Книжка Попова по паскалю и дельфи-хелп + позже мсдн с msvs 2006-2008 где-то урвал. По ним и учился. Были еще книжки что-то в духе 50 приемов чего-то там от Майерса.
Маленькая зарплата — это так же и возможности. Просто взять и например послать начальника в пешее путешествие. Взять и сделать по своему… и еще и оказаться правым. Что бы управлять людьми не обязательно быть руководителем. Хотя по началу я себя очень скромно вел. Очень. Пока не начал понимать что к чему и как да почему.
Кому болото — трата времени и сил, а кому песочница, которую будешь крутить как захочешь (денег же не платят, а люди пассивны довольно, кроме слов и ругани ничего не сделают). Да — ненависти огребешь по полной. Но увольнять тебя принципиально не будут, причины же очевидны, напротив — с огромным трудом уволишься.
Зато поворошив это все поймешь как оно детально работает и почему (или наоборот почему не работает).
В гугле таких же болот хватает, только там ты будешь винтиком и система в целом сложнее, что бы ее изучать без подготовки. А то и вовсе никогда не поймешь как оно получилось именно так. И потерять можно не 1-2 года, а лет 10.
А прыгать с одной работы на другую, только потому что на новой больше предлагают? Иметь трудовую, забитую под завязку записями в 1 год? Зачем?
Я уже видел резюме людей, у которых 10 раз работа поменялась за 7 лет… Как жить-то, если ты сам болото?
мне не помешало с зп в 30к перейти в коммерцию и зарабатывать 120к.
Тут вопрос что ты делаешь в "болоте", тухнешь или пытаешься что-то изменить. Хотя бы себя.
Но разумеется для каждого свое.
И да, работал в этих предприятиях пока учился.
И вы очень сильно ошибаетесь. Такие же "болота" и в коммерции бывают. Причем чаще, чем кажется и им для этого не нужны приставки "НИИ" или "НИЦ".
Пока устраивался на новую работу повидался за 5 собеседований на эти зоопарки.
Обычно для этого нужна почва. Сами по себе люди не становятся лентяями и разгильдяями. Если с детства к аккуратности и трудолюбию приучили — избавится сложно.
Проблема в том, что единицы не задают общий формат. А надеяться на чудеса — опрометчиво.
Манкидевелоперы обычно у не очень способных руководителей, коих более чем достаточно. А удержать опытного разработчика бывает сложно.
Вот что бы точно опознавать этих "неспособных" руководителей — и нужно идти работать в НИИ на пару лет, лучше еще во время учебы на полставки — посмотреть на них в живую. Только не надо этого делать с устоявшимся мнением, что там все такие — цель понять как одних от других отделять. Будет ощущение, что потерял время, зато прививка на всю жизнь. С ходу этих "эффективных" будешь распознавать. Это не только куроводителей касается. Вообще всего спектра специальностей ИТ.
А низкая зарплата только в масть в этом случае.
А теперь попробуй в коммерции, когда работать приходится очень много, заниматься такой социальной инженерией. Долго протянешь? Зарплату тебе не за исследование фирмы дают.