Lets talk about ability to predict some situation. In my opinion it is very impotent feature of experienced programmer. I want to describe real world episode from my life.
I got the task to implement the monitoring system. This system must to monitor some resources like database tables, web services, web pages and etc. But I got task only for database tables and it was impossible to predict future resources. But from my experience I got feeling that it will be some growing. And despite of pressure from my manager I was implementing system taking in mind future growing of requirements and therefore system. So I implement system using principle “Program from Interface”. And afterword It helped us to reduce amount of code and therefore time for implementation. So following three subsystems like web services, web pages and flash I implemented using Interfaces from first system.
Summarize.
Try to predict future growing of system. Program from interface not from implementation.
Friday, September 17, 2010
Tuesday, September 14, 2010
Wild Cards and Generics in Java. Collections vs Arrays.
Once my coworker just asked me what for generics and wild cards in java. And I didn’t answer at once. And I need to investigate and find simple way to explain what for wild cards in java.
Collections are very useful instrument for store and work with data. In previous versions of java collections can replace arrays only partly. But started from version java 5 we can completely replace arrays. Because we can use autoboxing, so it does not matters you put primitives or objects in collections. But we still have some restriction, for example when you declare method for some collections
use(List < Item >)
b- ut you want and can and must use this method not only for
List < Item > but also collections with children of Item. Signatures for methods should be as general as possible to maximize utility. If one can replace a type parameter by a wildcard then one should do so.
So you can do it with wild cards.
use(List < ? extend Item >)
For example ItemA extends Item
so we can call method use(List < ItemA >)but we still have some restriction even here. We can only use collection but we can’t change it.
If you want to change collection you need to use another wild card
use(List < ? super Item >)
You may find it helpful to think of ? extends T as containing every type in interval bounded by null
below and T above (where null is a subtype of every reference type). Similarly, you may think of
? super T as a containing every type in an interval bounded by T below and Object above.
Another one topic is arrays. Arrays are covariant, meaning that type S[] is considered to be a subtype of T[] whenever S is a subtype of T.
Integer[] ints = new Integer[] {1,2,3};
Number[] nums = ints;
nums[2] = 3.14; // array store exception
assert Arrays.toString(ints).equals("[1, 2, 3.14]"); // uh oh!
In this fragment we got runtime exception.
but if we will use wild cards
List < Integer > ints = Arrays.asList(1,2,3);
List < ? extends Number > nums = ints;
nums.put(2, 3.14); // compile-time error
assert ints.toString().equals("[1, 2, 3.14]"); // uh oh!
We got compile time error, and it is more better because we will get to know about error earlier and errors is detected by the compiler.
Apart from the fact that errors are caught earlier, there are many reasons to use collections instead of arrays. Collections are far more flexible than arrays.
I can suggest only one case when array can be more efficient then collection. Arrays of primitives when you avoid boxing can be more efficient but only because compiler. I believe future compilers may optimize collection classes specially.
To summarize, I suggest to use collections rather then arrays expect case of backward compatibility. I believe covariant arrays are an artifact of the lack of generics in earlier versions of Java.
Collections are very useful instrument for store and work with data. In previous versions of java collections can replace arrays only partly. But started from version java 5 we can completely replace arrays. Because we can use autoboxing, so it does not matters you put primitives or objects in collections. But we still have some restriction, for example when you declare method for some collections
use(List < Item >)
b
So you can do it with wild cards.
For example ItemA extends Item
so we can call method
If you want to change collection you need to use another wild card
use(List < ? super Item >)
You may find it helpful to think of ? extends T as containing every type in interval bounded by null
below and T above (where null is a subtype of every reference type). Similarly, you may think of
? super T as a containing every type in an interval bounded by T below and Object above.
Another one topic is arrays. Arrays are covariant, meaning that type S[] is considered to be a subtype of T[] whenever S is a subtype of T.
Integer[] ints = new Integer[] {1,2,3};
Number[] nums = ints;
nums[2] = 3.14; // array store exception
assert Arrays.toString(ints).equals("[1, 2, 3.14]"); // uh oh!
In this fragment we got runtime exception.
but if we will use wild cards
List
List
nums.put(2, 3.14); // compile-time error
assert ints.toString().equals("[1, 2, 3.14]"); // uh oh!
We got compile time error, and it is more better because we will get to know about error earlier and errors is detected by the compiler.
Apart from the fact that errors are caught earlier, there are many reasons to use collections instead of arrays. Collections are far more flexible than arrays.
I can suggest only one case when array can be more efficient then collection. Arrays of primitives when you avoid boxing can be more efficient but only because compiler. I believe future compilers may optimize collection classes specially.
To summarize, I suggest to use collections rather then arrays expect case of backward compatibility. I believe covariant arrays are an artifact of the lack of generics in earlier versions of Java.
Sunday, August 22, 2010
Боязнь потерять тёплое место
Сытую жизнь, перспективную работу
Молиться Богу и просить богатства
Всё это вызывает только рвоту
Тот, у кого есть мозги и руки
Никогда не пропадёт от голода и скуки
Никогда не станет рабом чужой воли
Ведь это страшнее голода и боли
Он не станет рабом судьбы
Вещей, системы — ничего не надо…
(с) Lumen — «Далеко»
Сытую жизнь, перспективную работу
Молиться Богу и просить богатства
Всё это вызывает только рвоту
Тот, у кого есть мозги и руки
Никогда не пропадёт от голода и скуки
Никогда не станет рабом чужой воли
Ведь это страшнее голода и боли
Он не станет рабом судьбы
Вещей, системы — ничего не надо…
(с) Lumen — «Далеко»
Быть воином — это самый эффективный способ жить. Воин сомневается и размышляет до того, как принимает решение. Но когда оно принято, он действует, не отвлекаясь на сомнения, опасения и колебания. Впереди — ещё миллионы решений, каждое из которых ждёт своего часа. Это — путь воина.
— Карлос Кастанеда «Колесо времени»
— Карлос Кастанеда «Колесо времени»
Гораздо больше людей сдавшихся, чем побежденных. Не то, чтобы им не хватало знаний, денег, ума, желания, а попросту не хватает мозга и костей. Грубая, простая, примитивная сила настойчивости есть некоронованная королева мира воли. Люди чудовищно ошибаются вследствие своей ложной оценки вещей. Они видят успехи, достигнутые другими, и считают их поэтому легко достижимыми. Роковое заблуждение! Наоборот, неудачи всегда очень часты, а успехи достигаются с трудом. Неудачи получаются в результате покоя и беспечности; за удачу же приходится платить всем, что у тебя есть, и всем, что ты есть.
Генри Форд
Генри Форд
Все началось с минералаи, возможно, с минералом и продолжается.Альянс человек - минерал, осуществляемый информатикой, я вляется новой платформой для сознания, - объясняет Уэллс.
- Минерал ? Вы говорите о силиконе, содержащемся в компьютерных чипах?
- Конечно, и еще о кристалах. Кристаллы квартца, которые придают ритм потоку электронов, относятся к камню так же, как мудрый человек к человеку дикому. Объединение гороного хрусталя и сознательного человека дает живой компьютер. Это и есть путь эволюции.
- Но компьютеры - это неподвижные объекты!
Достаточно их обесточить и все остановится.
Не стоит заблуждаться, Мишель. Блягодаря интернету существуют программы, кторые , как вирус могут прятаться в любом компьютерном устройстве. А выключить все машины в мире невозможно.
После биосферы и идоесферы появляется компьютеросфера.
Я не знал, что в Раю тоже можно увлекаться информатикой.
("Империя Ангелов" Бернар Вербер)
- Минерал ? Вы говорите о силиконе, содержащемся в компьютерных чипах?
- Конечно, и еще о кристалах. Кристаллы квартца, которые придают ритм потоку электронов, относятся к камню так же, как мудрый человек к человеку дикому. Объединение гороного хрусталя и сознательного человека дает живой компьютер. Это и есть путь эволюции.
- Но компьютеры - это неподвижные объекты!
Достаточно их обесточить и все остановится.
Не стоит заблуждаться, Мишель. Блягодаря интернету существуют программы, кторые , как вирус могут прятаться в любом компьютерном устройстве. А выключить все машины в мире невозможно.
После биосферы и идоесферы появляется компьютеросфера.
Я не знал, что в Раю тоже можно увлекаться информатикой.
("Империя Ангелов" Бернар Вербер)
Я не принимаю борьбу за деньги или социальный статус как цель жизни.
Цель жизни - попытка как-то очеловечить, одушевить и умилостивить мертвый и всемогущий полупроводниковый мир, проносящиеся по которому электронные импульсы определяют человеческую судьбу. Ведь даже богатство, к которому всю жизнь стремится человек, в наши дни означает не подвалы, где лежат груды золота, а совершенно бессмысленную для непосвященных цепочку нулей и единиц, хранящуюся в памяти банковского компьютера, и все, чего добивается самый удачливый предприниматель за полные трудов и забот годы перед тем, как инфаркт или пуля вынуждают его перейти к иным формам бизнеса, так это изменения последовательности зарядов на каком-нибудь тридцатидвухэмиттерном транзисторе из чипа, который так мал, что и раглядеть-то его можно только в микроскоп.(Виктор Пелевин)
Цель жизни - попытка как-то очеловечить, одушевить и умилостивить мертвый и всемогущий полупроводниковый мир, проносящиеся по которому электронные импульсы определяют человеческую судьбу. Ведь даже богатство, к которому всю жизнь стремится человек, в наши дни означает не подвалы, где лежат груды золота, а совершенно бессмысленную для непосвященных цепочку нулей и единиц, хранящуюся в памяти банковского компьютера, и все, чего добивается самый удачливый предприниматель за полные трудов и забот годы перед тем, как инфаркт или пуля вынуждают его перейти к иным формам бизнеса, так это изменения последовательности зарядов на каком-нибудь тридцатидвухэмиттерном транзисторе из чипа, который так мал, что и раглядеть-то его можно только в микроскоп.(Виктор Пелевин)
Subscribe to:
Posts (Atom)