Re: Creating a "public only" constructor
Dean Cleaver <[email protected]> Tue, 7 Apr 2009 00:05:12 +1200
| Newsgroups | gmane.comp.windows.devel.dotnet.advanced |
|---|---|
| Message-ID | <8E588B65FD82DF448592A3219102C395035CD2EE7A@SXSLAKL001.xceptionsoftware.com> |
I'd have to look into it, but I am not sure how blocking the checkin of some files in one assembly (actually, several similar assemblies over several solutions) based on a search for default constructors for classes in that assembly would work... ? -----Original Message----- From: Discussion of advanced .NET topics. [mailto:[email protected]] On Behalf Of Arun Sent: Tuesday, 07 April 2009 00:04 To: [email protected] Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor If you are using visual studio, you can write an add-in and integrate it with the check-in policy to avoid any wrong code being checked in. I guess this can be done fairly easily Regards Arun On Mon, Apr 6, 2009 at 5:29 PM, Dean Cleaver < [email protected]> wrote: > I guess I was hoping for a programmatic way to prevent the juniors screwing > up rather than me having to babysit them, and just hoping they don't. > > It's a complex and annoying situation... I get told I should be spending > more time reviewing their code, then get told I have to bill so many hours > to get my bonus, then get told I have to train other people on unrelated > things, and I have to do... and then I get told off for not "doing my job". > > -----Original Message----- > From: Discussion of advanced .NET topics. [mailto: > [email protected]] On Behalf Of Frans Bouma > Sent: Monday, 06 April 2009 23:47 > To: [email protected] > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > > Yeah - but I guess it's not just now - it's ongoing. I *don't trust* the > > juniors to be vigilant about using the right constructor, when it's so > easy > > to just "Class x = new class();" in that assembly. > > If they're junior's, they're learning. Which means they need > guidance and can't always be left alone, that's why they're juniors. > > > When I say I don't trust them, I found 57 copies of the same code in one > > solution - rather that put it in a base class (which already existed) > they > > made 57 copies of the same class. I don't have time (half the time not > even > > in the came country) to review all their work, but I can't rely on them > to > > be accurate. > > As you're not always around, who is guiding the juniors to become > non-juniors? Juniors aren't senior engineers you can leave alone and expect > good results. Unfortunately :( (I understand it's likely not your call and > you're just dealing with a bad situation as-is, I'm just trying to help you > even if it will sound like I am not helping you by working against what you > want to do) > > FB > > > > > Dino > > > > -----Original Message----- > > From: Discussion of advanced .NET topics. [mailto:ADVANCED- > > [email protected]] On Behalf Of Dave Jones > > Sent: Monday, 06 April 2009 23:16 > > To: [email protected] > > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > > > From reading all that has passed I would mark the default obsolete false > and > > the add treat warnings as errors into the main Code Base and the take the > > hit and fix the compile errors that appear in the code. I've done a > similar > > thing when changing from home grown data layer to ms app blocks that was > > half a million lines of code, 700 plus errors fixed. Dave. > > > > > > > > > > > > > > -----Original Message----- > > From: Dean Cleaver <[email protected]> > > > > Date: Mon, 6 Apr 2009 22:12:12 > > To: <[email protected]> > > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > > > > > It is template based - but a bespoke generator. > > > > "As is't the default ctor you're worried about, it's easy to spot with > > search/replace" > > > > Not with over 500 classes in 3 million lines of code it's not. > > > > There is no order of constructors. The "normal" apps which consist of > about > > 5 Windows Applications and 15 to 20 Web applications always use the > > defaults, as has be the case for the past 8 or 9 years. Using the > defaults > > causes the underlying class factory to use the defaults also, which is > > perfect for those apps. > > > > The scenario we have is we need to instantiate the same class on 2 > different > > servers, and clone one to the other. My issue is if I instantiate an > Invoice > > class using the second constructor to point it directly to it's server, > that > > the existing code might not point all child objects to the same server if > > they call the default constructor. And there is 8 to 10 years worth of > code > > already in there, so there is a *VERY* high chance that it uses the > default > > constructor. Hence why I was looking for a way to "block" the default > > constructor from being used insite the assembly. > > > > Trust me - if the default cannot be blocked, then there are no other > > options. Search and replace is not an option. Even putting attributes or > > demands on the constructors requires someone to hand code all 500 > > constructors... > > > > Dino > > > > -----Original Message----- > > From: Discussion of advanced .NET topics. [mailto:ADVANCED- > > [email protected]] On Behalf Of Frans Bouma > > Sent: Monday, 06 April 2009 20:34 > > To: [email protected] > > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > > > > If it were a new design yes - but it's not. The code generation has > > allowed > > > for this separate server capability, but I fear it cannot be utilised > > fully > > > because the code was historically never designed to work with it, and > > > without hundreds of hours of trawling through the current codebase it > > can't > > > be successfully changed to a class factory type scenario. > > > > If the code generation was template based, you might be able to do > > something about it, but I'm not sure how it's generated. > > > > Refactoring the code might be simpler than you might think. As is't > > the default ctor you're worried about, it's easy to spot with > > search/replace. if you load the codebase into vs.net, and do > find/replace > in > > files, and replace the call to the empty ctor to a call to a factory, the > > only thing that's to solve after that is the references to the right > > namespace where the factory is located. You can also spot calls to the > > second ctor with a simple regex in the find/replace dialog in vs.net. > > > > But I still don't fully understand what the order is in which the > > ctors are used. As I understand it, it seems that if I want to > instantiate > > an invoice, I use the empty ctor of Invoice. And if I want to instantiate > an > > invoiceitem, I use the parameter-using ctor in invoice, and you want to > > prevent that the invoiceitem empty ctor is used, correct? > > > > If you replace calls to both ctors to a call to a factory and make > > both ctors internal, you have full control over when what is called. > > However, I am a bit puzzled why the empty ctor is supposed to be public > if > > instantiating an invoiceitem is always dependent on the invoice itself > (as > > instantiating it on the same server as the invoice is always the best > idea) > > > > FB > > > > > > > > Dino > > > > > > -----Original Message----- > > > From: Discussion of advanced .NET topics. [mailto:ADVANCED- > > > [email protected]] On Behalf Of Frans Bouma > > > Sent: Monday, 06 April 2009 19:57 > > > To: [email protected] > > > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > > > > > Dean, > > > > > > I have the feeling the concern whether OTHER objects are created on > > > the > > same > > > server is not the concern of the class you want to instantiate but the > > > concern of a repository or other object. I know you're facing a large > > > pile of code, but you have to make a change somewhere anyway. I'd > > > factor out > > this > > > concern from this class and create factories to produce the proper > > instances > > > on the right server/service. > > > > > > FB > > > > > > > Hmm - yeah. Not a bad idea... but would mean that only the Business > > > Services > > > > layer would ever compile in that release, and everything else would > > fail. > > > > > > > > -----Original Message----- > > > > From: Discussion of advanced .NET topics. [mailto:ADVANCED- > > > > [email protected]] On Behalf Of Dave Jones > > > > Sent: Monday, 06 April 2009 19:31 > > > > To: [email protected] > > > > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > > > > > > > Wrap the constructor in a #if release? Then it won't be available > in > > > > debug? > > > > > > > > Dave > > > > > > > > > > > > > > > > > > > > -----Original Message----- > > > > From: Dean Cleaver <[email protected]> > > > > > > > > Date: Mon, 6 Apr 2009 16:02:43 > > > > To: <[email protected]> > > > > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > > > > > > > > > > > The second constructor allows you to create a business services > > > > object on > > > a > > > > different connection to the default - so I can specifically create > > > business > > > > services objects connected to 2 different servers from within the > > > > same application. I then want to ensure that if I create an Invoice > > > > object on a given server, than any InvoiceItems it creates are on > > > > the same server, > > > which > > > > would be done by using the second constructor. If a developer > > > > accidentally uses the default constructor, it could make a mess of > > > > the > > > system. > > > > > > > > -----Original Message----- > > > > From: Discussion of advanced .NET topics. [mailto:ADVANCED- > > > > [email protected]] On Behalf Of Shawn Wildermuth > > > > Sent: Monday, 06 April 2009 15:55 > > > > To: [email protected] > > > > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > > > > > > > I don't think you can. Can you explain why you want to protect it > > > > from internal classes? > > > > > > > > Thanks, > > > > > > > > Shawn Wildermuth > > > > http://wildermuth.com > > > > https://agilitrain.com > > > > Microsoft MVP (C#), MCSD.NET, Author and Speaker > > > > > > > > The Silverlight Tour is coming to a city near you! > > > > > > > > > > > > -----Original Message----- > > > > From: Discussion of advanced .NET topics. > > > > [mailto:[email protected]] On Behalf Of Dean > > > > Cleaver > > > > Sent: Sunday, April 05, 2009 11:42 PM > > > > To: [email protected] > > > > Subject: [ADVANCED-DOTNET] Creating a "public only" constructor > > > > > > > > Hey, anyone know if you can do this with attributes or something? I > > > > want > > > to > > > > have 2 public constructors: > > > > > > > > public ClassName() > > > > { > > > > } > > > > > > > > public ClassName(some param) > > > > { > > > > } > > > > > > > > I want both publically accessible, but I want the default one > > > *inaccessible* > > > > internally. Can that be done? > > > > > > > > Dino > > > > > > > > =================================== > > > > View archives and manage your subscription(s) at > > > > http://peach.ease.lsoft.com/archives > > > > > > > > =================================== > > > > View archives and manage your subscription(s) at > > > > http://peach.ease.lsoft.com/archives > > > > > > > > =================================== > > > > View archives and manage your subscription(s) at > > > > http://peach.ease.lsoft.com/archives > > > > > > > > =================================== > > > > View archives and manage your subscription(s) at > > > > http://peach.ease.lsoft.com/archives > > > > > > =================================== > > > View archives and manage your subscription(s) at > > > http://peach.ease.lsoft.com/archives > > > > > > =================================== > > > View archives and manage your subscription(s) at > > > http://peach.ease.lsoft.com/archives > > > > =================================== > > View archives and manage your subscription(s) at > > http://peach.ease.lsoft.com/archives > > > > =================================== > > View archives and manage your subscription(s) at > > http://peach.ease.lsoft.com/archives > > > > =================================== > > View archives and manage your subscription(s) at > > http://peach.ease.lsoft.com/archives > > =================================== > View archives and manage your subscription(s) at > http://peach.ease.lsoft.com/archives > > =================================== > View archives and manage your subscription(s) at > http://peach.ease.lsoft.com/archives > =================================== View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives =================================== View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives