-
Content Count
1137 -
Joined
-
Last visited
-
Days Won
105
Posts posted by Dalija Prasnikar
-
-
30 minutes ago, AlekXL said:Neither. "For they have sown the wind, and they shall reap the whirlwind", Hosea 8:7. You were quite critical about my demeanour, well, you always reap more than you've sown. Nature's law, God's Word, uncontestable anyway.
I am critical, because you are seeking collaboration and your attitude is making more harm than good. Not just for your particular request, but it is undermining other efforts in similar areas. I am not stranger to saying harsh words, but there is a difference between backing your words with actual arguments and empty phrases like "we love Delphi more than you do".
Feel free to criticize me when I do something wrong. I have no problem with that.
I am an atheist and God has no meaning to me. For my actions I will be and I am accountable in this life only.
-
5
-
1
-
-
27 minutes ago, AlekXL said:old news. Best news is inline variables and deprecating ARC.
It does not matter how old it is, it matters that things can change .
Just like deprecating ARC at some point seemed highly unlikely. And for the record that is the change I didn't wished for.
-
7 hours ago, Joseph MItzen said:And others could tell you stories of the issues that have been closed as "won't fix" or "by design". I remember Dalija Prasnikar got Marco to re-open several that he'd closed in the past (as far as I know they never actually got fixed though).
Baby steps
If bug report is open, it does have greater chances for being fixed than if it is closed. Also not all bugs are easily fixable.
But one of the greatest issues, that for long period seemed like it will never happen, was introducing 8bit strings to all platforms. If nothing else, this makes me hopeful.
-
2
-
-
9 hours ago, AlekXL said:Ok, I've just checked. And must say, this is officially a lie (were you a rookie, I would call it mistake, but you're prominent, trusted member of the community, so take it)
Swig fork of Delphi is able to import C++ class -> Delphi class wrapped, through dll import.
Swig generates c++ proxy *.cxx from a header, and even able to specialize C++ template class (you need to write something like TEMPLATE_WRAP0(vector ,vecint, int );
Swig flattens said class members to in the *.cxx and export this through __declspec(dllexport) (or statically, but delphi-swig cannot handle static linking)
Then, Swig generates pas stub , which imports flattened methods(stupidly, it does not add underscores to names, but this is easy fixed by
__DLLNAME name ' ==> __DLLNAME name '_ "replace all"
Additionally (default, but optional), Swig adds Delphi class wrapper, for the C++ class/specialized template class.
I've just regenerated, and compiled template example, from example.h example.i , with C++Builder and Delphi.. This example is simplistic, so I don't know how it would work it with complex c++ classes, but considering SWIG is serious tool, we can hope.
And here your splendid personality jumps out again. Yes, I made a mistake. People do that, you know, regardless of experience. After being knowledgeable in your field of work, ability to recognize and admit your own mistakes is one of important qualities for successful developers. If one is not able to own his own mistakes it is hard to expect that such person will allow others to make mistakes without making too much fuss about it. Your response shows that either you don't have that quality or you have really short fuse. And neither makes you a wonderful team mate.
And If you read my response you will see that I didn't included SWIG library (two and some years old) - I simply overlooked it. Last time I had to use C++ with Delphi was 8 years ago and it was no fun. I am glad that landscape has changed in that regard.
Delphi ecosystem is not huge (no matter how much we would want it to be), and ability to interact with libraries written in other languages can make a whole world of difference. You don't want to reinvent hot water if it is already out there. Also, you might use other toolsets besides Delphi and utilizing same libraries across those toolsets also counts a great deal.
-
7
-
-
34 minutes ago, AlekXL said:To get bugs fixed? Code generation improved? I dont dream that Delphi compiler will soon be completely free, I just want it to be better
Serious question. So far you have managed to volunteer other people to do the compiler fixing.
But you haven't told us anything about what can you offer in that regard? How can you help improving and fixing the compiler? What are your skills?
-
4
-
-
10 minutes ago, AlekXL said:please clarify, those tools edwinyzh mentioned is unable bind to C++ class?
First tool explicitly mentions it is not for translating C++ header files
Another excellent tool which utilize CLang to convert C (not C++) header files to Delphi: https://github.com/neslib/Chet
Second tool description says This tool will convert most of your standard C code.
So, yes C, no C++.
For using C++ you need to go extra mile: http://rvelthuis.de/articles/articles-cppobjs.html
-
1
-
-
10 minutes ago, AlekXL said:Oh, that's nice.. Looks like Joseph Mitzen exaggerated poor condition of C++/Delphi linkage? All those 5 pages of discussion worth that single post..
Just for the record C is not C++. Joseph Mitzen didn't exaggerated that.
-
1
-
-
28 minutes ago, AlekXL said:Lars, just please don't sabotage the discussion and the cause, will you?
Agreed. There is no need for others to sabotage anything. You are perfectly capable of sabotaging both the proposal and this discussion on your own.
-
5
-
-
On 3/20/2019 at 3:02 PM, Uwe Raabe said:Are people still using that old component pallet?
Yep.
-
13 minutes ago, RDPasqua said:before Delphi fail, buy Island LLVM from RemObjects, they have already a Delphi RTL compatible. Bind VCL and or FMX over it and have all OS, all platforms, clean, fast, perfect code.
Without going into deep discussion about compatibility and other technical issues... AFAIK Marc Hoffman would rather drop dead than sell anything to Embarcadero...
-
2
-
2
-
-
11 minutes ago, David Heffernan said:That's surely not a problem with LLVM per se, rather the Delphi compiler on top of LLVM?
Core issue is in LLVM https://bugs.llvm.org/show_bug.cgi?id=1269
While in theory it would be possible to address this issue from Delphi side, it is probably as hard as solving it on LLVM side for the similar reasons.
The most prominent issue is in capturing exceptions raised from accessing nil references, and addressing this particular use case would probably be simpler than all encompassing solution. However, I am not in position to say how easy or hard would be to implement this kind of fix in Delphi compiler.
-
23 minutes ago, Markus Kinzler said:But this was the "old-gen" compiler beeing subsituted for most of the targets now. Only the Win32 and OS32 compilers are based on it.
No. Only iOS and Android are LLVM based. http://docwiki.embarcadero.com/RADStudio/Rio/en/Delphi_Toolchains AFAIK first Linux release (Tokyo) was also LLVM.
And you don't want to have LLVM on other platforms for few reasons.
Not only it is slower than "old" handcrafted Delphi compiler, more importantly LLVM cannot handle exceptions in way Delphi compiler does. Using LLVM on desktop would break a whole a lot of code.
You can fin more at https://dalijap.blogspot.com/2018/10/catch-me-if-you-can.html
-
27 minutes ago, Stefan Glienke said:IDE tooling does not work properly and some of it completely stops,
Also inline variables of a managed type are not always properly initialized.
As much as I like this feature syntax wise - I would stay away from it for now 😞
If everyone stays away, bugs will never be found and fixed...
I have used them a lot in various shorter and longer experimental code... so far so good (in spite known bugs)
-
1
-
-
On 3/28/2019 at 8:14 PM, edwinyzh said:Inheritance for extension is Ok, but for code reuse? Maybe not that good.
Although I have achieved code reuse with class inheritance, but from time to time I feel unwanted class coupling were introduced too.
Another thing... you are asking confirmation for some design approach that didn't feel right at the end. If it does not feel right, there is probably something wrong and it is quite likely that composition would be better choice. If composition solved your problem, probably it IS the right choice and the next time you encounter similar situation it will probably be right choice again. But, without seeing actual code and knowing the context in which it will be used, it is really impossible for us to say one way or the other.
-
1
-
-
16 hours ago, edwinyzh said:Let me reiterate it - need not to say, both inheritance and composition have their own application situations, there is no doubt about it.
The point is, to simply put, always consider composition first before you inheriting a class, if both can do the job, prefer composition over inheritance.
That's all about the point.
Err.... No...
You started with prefer, now you have come to always... and you are conditioning yourself to use composition without considering inheritance... you should consider both at the same time. There are always trade offs and you have to take those into account. If you start with composition and say, OK composition can solve this problem, I am all done, at some point you will make wrong choice because sometimes inheritance will be better fit. Now, I could be wrong, I don't know what is in your head...
The more skill one has.. the easier is to decide... Sometimes you will just take a glimpse on some problem and you will immediately know what is the proper solution... but just because you are able to decide fast, that does not mean that you didn't fully considered all consequences of particular solution.
Again, while rules help you have to be careful with the rules. They cannot save you from thinking and using the best tool for the job.
I don't know how many times I used inheritance over composition or vice versa, I am not counting... it is irrelevant... even if 90% of the time composition is better, that still leaves you with 10% where it is not.
-
1
-
-
51 minutes ago, edwinyzh said:Do you know the circle-ellipse problem? That's the problem of inheritance.
It is problem with bad inheritance. Like I previously said, if you take narrow approach and only focus on Circle IS specialized case of Ellipse, you are bound to make a mistake. Even more so, if you lock particular behavior in base class that cannot be universally applied to all sub-classes.
-
2
-
-
15 minutes ago, edwinyzh said:You miss the 'code reuse' part of the original question.
No I didn't miss it.
But code reuse is separate matter. It is not a primary drive. Code reuse plays significant part in OOP design - you don't want to unnecessarily repeat code, but you also don't want to make your choices solely based on code reuse. Whatever you do, you always must look at the problem from many different aspects and all basic OOP principles. If you take too narrow approach, you will most likely make wrong choice.
Sometimes, answer to inheritance vs composition for code reuse is neither, because doing one or the other can result in monstrosity. Sometimes, repeating two lines of code and keeping things simple is more viable approach.
So back to your question and original article - "If it's only about code resue"
Answer depends on how you interpret the question... it is never ONLY about code reuse... but if reusing some lines of code IS the only reason to use inheritance, then you are probably doing that part wrong... at the same time composition in such case can also be wrong choice. Depends what is the purpose of that code and its function. If you cannot clearly define its responsibility then you are bound to go wrong with composition, too.
-
1
-
-
30 minutes ago, Anders Melander said:@Dalija Prasnikar I agree with your characterization but in some cases I find that composition is better suited than inheritance even though inheritance would be more natural. For example if I were to create a list of TSomething it would be tempting to use TList<T> as a base class, Problem is that it might give me too much. If I only need an Add method, a Count and an array property, then composition is probably better (I guess one could call it inheritance through composition).
I've seen too many examples of inheritance (not just from TList) where most of the inherited methods doesn't make any sense and would break the application if used.
That is why there are no clean and absolute rules. You have to decide what makes sense in each particular case. Sometimes creating wrapper classes that will expose only valid functionality makes sense, sometimes list is just a list.
-
2
-
-
35 minutes ago, edwinyzh said:@Dalija Prasnikar I'd like to add two things:
- I believe you are talking about implementation inheritance but not interface inheritance.
- The common mistake to make when using implementation inheritance is creating God Object.
Interfaces don't have implementation, so if you want to reuse code you either have to use class inheritance or you must use composition.
IS-A and HAS-A rule can help you determine whether inheritance makes sense in a first place.
If IS-A rule is satisfied, then you have to see whether in that particular case you should use class inheritance or composition. When it comes to creating God objects, they break other OO principles.
Composition is preferred - problem with that approach and your original question "Prefer composition over inheritance for code reuse?" is that people tend to interpret it like NEVER use inheritance. And then they go down the different rabbit hole.
-
3
-
45 minutes ago, edwinyzh said:@Dalija Prasnikar Thanks for sharing.
Correct, it depends on the specific situation, I agree with you, except that I somehow think the 3 things you mentioned - delegation, composition and aggregation are the same thing.
Not exactly... there are slight differences in behavior. Not that this part matters when you are choosing between inheritance and composition (as general term)
-
It always depends on particular situation. Both composition and inheritance have their place. Sometimes you can use either, sometimes there is a clear distinction.
Some tips that can help you decide.
- IS-A - inheritance - Sword IS-A Weapon so Sword should inherit Weapon
- HAS-A - composition or aggregation - Unit HAS-A Weapon so Unit can be composed with Weapon object
With simple classes that satisfy IS-A condition plain inheritance will do. With more complex classes, you may want to use composition or delegate some behavior to other classes, especially if that behavior can be reused independently.
- Delegation - delegate behavior to another class when it is not an objects responsibility to implement behavior on its own
- Composition - when object is gone the composed objects are also gone - when Pizza is gone so are the ingredients
- Aggregation - class is used as a part of another class, but still exists outside that other class - when Unit dies Weapon still exists
-
8
-
That change was not worth while even back then. You had two variants for Seek and it was very easy to use wrong one. If you used 32 bit one on streams that support 64 bit your code would only work for streams smaller than 2GB.
Change didn't affected older code, but it had permanent negative effect on new code.
I encountered such bugs myself, and also have seen others bumping into it on numerous occasions. Yes, at the end our code was at fault, but it was really easy mistake to make.
There was several bug reports around that issue at the time in old Quality Central.
-
1
-
-
33 minutes ago, Anders Melander said:Good thing you're not in charge of the RTL then.
IRL backward compatibility matters.
YES, backward compatibility matters. But in cases where backward compatibility causes more trouble down the road, then it is not worth the price.
In this case, maintaining backward compatibility also opened TStream and descendant classes to subtle bugs when working with streams larger than 2GB.
-
3
-
1
-
-
29 minutes ago, ByteJuggler said:- As a digression, I've also found (irritatingly) that out of the 2 phones I have available, debugging also doesn't work on the newer one (Note 8 ) because of "reasons" (something Google changed supposedly and Emba therefore says they won't fix), while it does work on the older phone (note 4).
If your Note 8 has Oreo 8.0 OS then debugging does not work because Google screwed up on OS level. You need to update OS to 8.1 that fixes the issue. It was not something EMBT could fix.
http://blog.marcocantu.com/blog/2017-december-delphi-android81-debugging.html
-
1
Class inheritance and hides method
in Algorithms, Data Structures and Class Design
Posted
http://docwiki.embarcadero.com/RADStudio/Rio/en/Methods_(Delphi)
Overload is used when you have methods with same name but different parameters.
Override is used when you have methods with same name and same parameters, but one is in parent class (marked as virtual or dynamic) and other is in child class and you want to override method functionality in child class.