Wednesday, July 09, 2008

Type-safe Builder Pattern in Scala

The Builder Pattern is an increasingly popular idiom for object creation. Traditionally, one of it's shortcomings in relation to simple constructors is that clients can try to build incomplete objects, by omitting mandatory parameters, and that error will only show up in runtime. I'll show how to make this verification statically in Scala.


So, let's say you want to order a shot of scotch. You'll need to ask for a few things: the brand of the whiskey, how it should be prepared (neat, on the rocks or with water) and if you want it doubled. Unless, of course, you are a pretentious snob, in that case you'll probably also ask for a specific kind of glass, brand and temperature of the water and who knows what else. Limiting the snobbery to the kind of glass, here is one way to represent the order in scala.
sealed abstract class Preparation  /* This is one way of coding enum-like things in scala */
case object Neat extends Preparation
case object OnTheRocks extends Preparation
case object WithWater extends Preparation

sealed abstract class Glass
case object Short extends Glass
case object Tall extends Glass
case object Tulip extends Glass

case class OrderOfScotch(val brand:String, val mode:Preparation, val isDouble:Boolean, val glass:Option[Glass])

A client can instantiate their orders like this:
val normal = new OrderOfScotch("Bobby Runner", OnTheRocks, false, None)
val snooty = new OrderOfScotch("Glenfoobar", WithWater, false, Option(Tulip));

Note that if the client doesn't want to specify the glass he can pass None as an argument, since the parameter was declared as Option[Glass]. This isn't so bad, but it can get annoying to remember the position of each argument, specially if many are optional. There are two traditional ways to circumvent this problem — define telescoping constructors or set the values post-instantiation with accessors — but both idioms have their shortcomings. Recently, in Java circles, it has become popular to use a variant of the GoF Builder pattern. So popular that it is Item 2 in the second edition of Joshua Bloch's Effective Java. A Java-ish implementation in Scala would be something like this:
class ScotchBuilder {
private var theBrand:Option[String] = None
private var theMode:Option[Preparation] = None
private var theDoubleStatus:Option[Boolean] = None
private var theGlass:Option[Glass] = None

def withBrand(b:Brand) = {theBrand = Some(b); this} /* returning this to enable method chaining. */
def withMode(p:Preparation) = {theMode = Some(p); this}
def isDouble(b:Boolean) = {theDoubleStatus = some(b); this}
def withGlass(g:Glass) = {theGlass = Some(g); this}

def build() = new OrderOfScotch(theBrand.get, theMode.get, theDoubleStatus.get, theGlass);
}

This is almost self-explanatory, the only caveat is that verifying the presence of non-optional parameters (everything but the glass) is done by the Option.get method. If a field is still None, an exception will be thrown. Keep this in mind, we'll come back to it later.

The var keyword prefixing the fields means that they are mutable references. Indeed, we mutate them in each of the building methods. We can make it more functional in the traditional way:
object BuilderPattern {
class ScotchBuilder(theBrand:Option[String], theMode:Option[Preparation], theDoubleStatus:Option[Boolean], theGlass:Option[Glass]) {
def withBrand(b:String) = new ScotchBuilder(Some(b), theMode, theDoubleStatus, theGlass)
def withMode(p:Preparation) = new ScotchBuilder(theBrand, Some(p), theDoubleStatus, theGlass)
def isDouble(b:Boolean) = new ScotchBuilder(theBrand, theMode, Some(b), theGlass)
def withGlass(g:Glass) = new ScotchBuilder(theBrand, theMode, theDoubleStatus, Some(g))

def build() = new OrderOfScotch(theBrand.get, theMode.get, theDoubleStatus.get, theGlass);
}

def builder = new ScotchBuilder(None, None, None, None)
}

The scotch builder is now enclosed in an object, this is standard practice in Scala to isolate modules. In this enclosing object we also find a factory method for the builder, which should be called like so:
import BuilderPattern._

val order = builder withBrand("Takes") isDouble(true) withGlass(Tall) withMode(OnTheRocks) build()

Looking back at the ScotchBuilder class and it's implementation, it might seem that we just moved the huge constructor mess from one place (clients) to another (the builder). And yes, that is exactly what we did. I guess that is the very definition of encapsulation, sweeping the dirt under the rug and keeping the rug well hidden. On the other hand, we haven't gained all the much from this "functionalization" of our builder; the main failure mode is still present. That is, having clients forget to set mandatory information, which is a particular concern since we obviously can't fully trust the sobriety of said clients*. Ideally the type system would prevent this problem, refusing to typecheck a call to build() when any of the non-optional fields aren't set. That's what we are going to do now.

One technique, which is very common in Java fluent interfaces, would be to write an interface for each intermediate state containing only applicable methods. So we would begin with an interface VoidBuilder having all our withFoo() methods but no build() method, and a call to, say, withMode() would return another interface (maybe BuilderWithMode), and so on, until we call the last withBar() for a mandatory Bar, which would return an interface that finally has the build() method. This technique works, but it requires a metric buttload of code — for n mandatory fields 2n interfaces should be created. This could be automated via code generation, but there is no need for such heroic efforts, we can make the typesystem work in our favor by applying some generics magic. First, we define two abstract classes:
abstract class TRUE
abstract class FALSE

Then, for each mandatory field, we add to our builder a generic parameter:
class ScotchBuilder[HB, HM, HD](val theBrand:Option[String], val theMode:Option[Preparation], val theDoubleStatus:Option[Boolean], val theGlass:Option[Glass]) {

/* ... body of the scotch builder .... */

}

Next, have each withFoo method pass ScotchBuilder's type parameters as type arguments to the builders they return. But, and here is where the magic happens, there is a twist on the methods for mandatory parameters: they should, for their respective generic parameters, pass instead TRUE:
class ScotchBuilder[HB, HM, HD](val theBrand:Option[String], val theMode:Option[Preparation], val theDoubleStatus:Option[Boolean], val theGlass:Option[Glass]) {
def withBrand(b:String) =
new ScotchBuilder[TRUE, HM, HD](Some(b), theMode, theDoubleStatus, theGlass)

def withMode(p:Preparation) =
new ScotchBuilder[HB, TRUE, HD](theBrand, Some(p), theDoubleStatus, theGlass)

def isDouble(b:Boolean) =
new ScotchBuilder[HB, HM, TRUE](theBrand, theMode, Some(b), theGlass)

def withGlass(g:Glass) =
new ScotchBuilder[HB, HM, HD](theBrand, theMode, theDoubleStatus, Some(g))
}

The second part of the magic act is to apply the world famous pimp-my-library idiom and move the build() method to an implicitly created class, which will be anonymous for the sake of simplicity:
implicit def enableBuild(builder:ScotchBuilder[TRUE, TRUE, TRUE]) = new {
def build() =
new OrderOfScotch(builder.theBrand.get, builder.theMode.get, builder.theDoubleStatus.get, builder.theGlass);
}

Note the type of the parameter for this implicit method: ScotchBuilder[TRUE, TRUE, TRUE]. This is the point where we "declare" that we can only build an object if all the mandatory parameters are specified. And it really works:
scala> builder withBrand("hi") isDouble(false) withGlass(Tall) withMode(Neat) build()
res5: BuilderPattern.OrderOfScotch = OrderOfScotch(hi,Neat,false,Some(Tall))

scala> builder withBrand("hi") isDouble(false) withGlass(Tall) build()
<console>:9: error: value build is not a member of BuilderPattern.ScotchBuilder[BuilderPattern.TRUE,BuilderPattern.FALSE,BuilderPattern.TRUE]
builder withBrand("hi") isDouble(false) withGlass(Tall) build()

So, we achieved our goal (see the full listing below). If you are worried about the enormous parameter lists inside the builder, I've posted here an alternative implementation with abstract members instead. It is more verbose, but also cleaner.

Now, remember those abstract classes TRUE and FALSE? We never did subclass or instantiate them at any point. If I'm not mistaken, this is an idiom named Phantom Types, commonly used in the ML family of programming languages. Even though this application of phantom types is fairly trivial, we can glimpse at the power of the mechanism. We have, in fact, codified all 2n states (one for each combination of mandatory fields) as types. ScotchBuilder's subtyping relation forms a lattice structure and the enableBuild() implicit method requires the supremum of the poset (namely, ScotchBuilder[TRUE, TRUE, TRUE]). If the domain requires, we could specify any other point in the lattice — say we can doll-out a dose of any cheap whiskey if the brand is not given, this point is represented by ScotchBuilder[_, TRUE, TRUE]. And we can even escape the lattice structure by using Scala inheritance. Of course, I didn't invent any of this; the idea came to me in this article by Matthew Fluet and Riccardo Pucella, where they use phantom types to encode subtyping in a language that lacks it.



object BuilderPattern {
sealed abstract class Preparation
case object Neat extends Preparation
case object OnTheRocks extends Preparation
case object WithWater extends Preparation

sealed abstract class Glass
case object Short extends Glass
case object Tall extends Glass
case object Tulip extends Glass

case class OrderOfScotch(val brand:String, val mode:Preparation, val isDouble:Boolean, val glass:Option[Glass])

abstract class TRUE
abstract class FALSE

class ScotchBuilder
[HB, HM, HD]
(val theBrand:Option[String], val theMode:Option[Preparation], val theDoubleStatus:Option[Boolean], val theGlass:Option[Glass]) {
def withBrand(b:String) =
new ScotchBuilder[TRUE, HM, HD](Some(b), theMode, theDoubleStatus, theGlass)

def withMode(p:Preparation) =
new ScotchBuilder[HB, TRUE, HD](theBrand, Some(p), theDoubleStatus, theGlass)

def isDouble(b:Boolean) =
new ScotchBuilder[HB, HM, TRUE](theBrand, theMode, Some(b), theGlass)

def withGlass(g:Glass) = new ScotchBuilder[HB, HM, HD](theBrand, theMode, theDoubleStatus, Some(g))
}

implicit def enableBuild(builder:ScotchBuilder[TRUE, TRUE, TRUE]) = new {
def build() =
new OrderOfScotch(builder.theBrand.get, builder.theMode.get, builder.theDoubleStatus.get, builder.theGlass);
}

def builder = new ScotchBuilder[FALSE, FALSE, FALSE](None, None, None, None)
}



* Did you hear that noise? It's the sound of my metaphor shattering into a million pieces



EDIT 2008-07-09 at 19h00min: Added introductory paragraph.

947 comments:

«Oldest   ‹Older   801 – 947 of 947
Petersons said...

Very informative site, i must bookmark it, keep posting interesting articles...


Baby shower game

Artificial Intelligence Training in Bangalore said...

I wanted to leave a little comment to support you and wish you the best of luck. We wish you the best of luck in all of your blogging endeavors.

Artificial Intelligence Training in Bangalore

Machine Learning Course in Bangalore said...

Truly incredible blog found to be very impressive due to which the learners who go through it will try to explore themselves with the content to develop the skills to an extreme level. Eventually, thanking the blogger to come up with such phenomenal content. Hope you arrive with similar content in the future as well.

Machine Learning Course in Bangalore

Machine Learning Course in Bangalore said...

Truly incredible blog found to be very impressive due to which the learners who go through it will try to explore themselves with the content to develop the skills to an extreme level. Eventually, thanking the blogger to come up with such phenomenal content. Hope you arrive with similar content in the future as well.

Machine Learning Course in Bangalore

Petersons said...

I wanted to thank you for this great read!! I definitely enjoying every little bit of it.I have you bookmarked to check out new stuff you post.


Washing Machine Repair

Petersons said...

I wanted to thank you for this great read!! I definitely enjoying every little bit of it.I have you bookmarked to check out new stuff you post.


scam warning

Home Improvement said...

Great post I must say and thanks for the information. Education is definitely a sticky subject. However, is still among the leading topics of our time. I appreciate your post and look forward to more. Pareto Analysis

Petersons said...

חייב להחמיא על הכתיבה. מאמר מצוין.

פרגולה אלומיניום

Website Designing Company said...

Website Designing Agencies India

Website Designing Company said...

Anti Dripping Additives For Plastics

Website Designing Company said...

Website Development Agency in India

vivikhapnoi said...

Fascinating blog! Is your theme custom made or did you download it from somewhere?A theme like yours with a few simple tweeks would really make my blog jump out. Please let me know where you got your design. With thanks
ve may bay tu My ve Viet Nam

ve may bay tu han quoc ve viet nam

Vé máy bay giá rẻ tu Nhat Ban ve Viet Nam

vé máy bay từ singapore về hà nội vietjet

vé máy bay giá rẻ tu Dai Loan ve Viet Nam

chuyến bay nhân đạo từ canada về việt nam

Institute said...

Wow, happy to see this awesome post. I hope this think help any newbie for their awesome work and by the way thanks for share this awesomeness, i thought this was a pretty interesting read when it comes to this topic. Thank you..
Artificial Intelligence Course

Petersons said...

חייב להחמיא על הכתיבה. מאמר מצוין.

רעות מלכין עיצוב גבות

Emerging Technologies said...

I need to thank you for this very good read and i have bookmarked to check out new things from your post. Thank you very much for sharing such a useful article and will definitely saved and revisit your site.
Data Science Course

Education said...

Your site is truly cool and this is an extraordinary moving article and If it's not too much trouble share more like that. Thank You..
Digital Marketing Course in Hyderabad

Website Designing Company said...

fire retardant

Knowledge said...

Thank a lot. You have done excellent job. I enjoyed your blog . Nice efforts
Data Science Certification in Hyderabad

Raj Kumar said...

Very Nice. Thanks for Sharing such an amazing article.
software development companies uk
cyber security companies in uk
edtech companies in uk
custom software development uk
software testing company in uk
penetration testing companies in uk
software development companies in usa
salesforce crm software in uk
edtech development company in us
cyber security companies in us
cyber security companies in uae
software development company in uae
penetration testing companies in uae
Test Automation services in India
cyber security companies in India

Chanson Water said...

Chanson alkaline water purifier is equipped best in purification technology with several stages of 100% RO and UV purification delivers alkaline water with pH8 to pH10 revitalizer restructures water molecules for enhanced hydration and mineral bsorption. Thus, if you want to discover the best alkaline water machine you don’t get better than the Chanson Quality Water. So, if you want clear, crisp, and pure water with a pleasing taste and minerals for your body’s health, use Chanson Alkaline Water Purifier in your home. Clean, refreshing, and for healthy hydration, you don’t get a substitute to Chanson’s Alkaline Water Filter.

prakash tradewell said...

Prakash Tradewell, with over decades of experience in manufacturing and supplying electrical insulating sleeves and cables, has boarded on new industry benchmarks. Our range includes the best fibre sleeves, heat-shrinkable sleeves, fiberglass sleeve, insulating wires, fibre glass manufacturer. We also offer polyester yarns and polyester threads. Prakash Tradewell’s procure high-quality raw material from our reliable vendors for the manufacturing of these products.

Petersons said...

I guess there's always an easier way ...


Roofing service in Columbus

Branzone Creative Design Agency said...

Nice Article. Branzone - Branding & Logo Design Company In Coimbatore

Venkygaming said...

Hi,i would like to tell is it is a perfect platform acquire my knowledge of skillset needed to me,and good blog as well.

Digital Marketing Training In Telugu
Digital Marketing Means In Telugu

Petersons said...

Very informative site, i must bookmark it, keep posting interesting articles...


auto Locksmith

skvisiontec said...

thanks very nice article keep up the good work Rubber Calender Machine

skvisiontec said...

thanks very nice article keep up the good work My Quickbook

Julli said...

It's always exciting to read articles from other writers and practice something from their websites.
Clear Water Management

Michael Oliver said...

Digital Marketing, Digital Marketing Online Training, Digital Marketing Training Programs, Women Entrepreneurship, Women Entrepreneurship Training Programs, Digital marketing online video course, Women Entrepreneurship Online Certification Course, Business coaching, Training for Business owners, Business coaching for women, young entrepreneurs training

https://www.eminentdigitalacademy.com/

Petersons said...

Very informative site, i must bookmark it, keep posting interesting articles...


Houston Garage Door 4 Business

Julli said...

I like this post, And I figure that they have a great time to peruse this post, they might take a decent site to make an information, thanks for sharing it with me.
24 Hour Locksmith

Julli said...

Thanks for the nice blog. It was very useful for me. I'm happy I found this blog. Milton Locksmith Pro

Business Analytics Course said...

You have completed certain reliable points there. I did some research on the subject and found that almost everyone will agree with your blog.
Business Analytics Course

James said...

I was exactly searching for. Thanks for such a post and please keep it up. locksmith in Vaughns

IT Tutorials said...

It's Very informative and helpful. If you are interested in learning JMeter please refer to the link below. Thank you

JMeter Training in Chennai | JMeter Course in Chennai | JMeter Online Course

Data Analytics Course said...

Happy to chat on your blog, I feel like I can't wait to read more reliable posts and think we all want to thank many blog posts to share with us.
Data Analytics Course in Bangalore

Dubai Fun Club said...

Connect for beautiful and hot girls entertaining services
Dubai Escorts
call girls in Dubai

Petersons said...

Can you please provide more information on this subject? BTW your blog is great. Cheers.


etobicokecarlocksmith.com

Business Analytics Course said...

I wanted to leave a little comment to support you and wish you the best of luck. We wish you the best of luck in all of your blogging endeavors.
Business Analytics Course

Business Analytics Course said...

I am sure it will help many people. Keep up the good work. It's very compelling and I enjoyed browsing the entire blog.
Business Analytics Course

Data Analytics Course said...

Very good message. I stumbled across your blog and wanted to say that I really enjoyed reading your articles. Anyway, I will subscribe to your feed and hope you post again soon.
Data Analytics Course in Bangalore

Data Analytics Course said...

I am more curious to take an interest in some of them. I hope you will provide more information on these topics in your next articles.
Data Analytics Course in Bangalore

Digital Marketing Course said...

I was browsing the internet for information and found your blog. I am impressed with the information you have on this blog.

Digital Marketing Course in Bangalore

Digital Marketing Course said...

I will very much appreciate the writer's choice for choosing this excellent article suitable for my topic. Here is a detailed description of the topic of the article that helped me the most.
Digital Marketing Course in Bangalore

Digital Marketing Course said...

It is late to find this act. At least one should be familiar with the fact that such events exist. I agree with your blog and will come back to inspect it further in the future, so keep your performance going.

Digital Marketing Course in Bangalore

Jack Stark said...

Sankey Visualization is the best visualization to improve your SEO. Sankey diagram is a very useful visualization to show the flow of data.ChartExpo provides you a better and easiest way to create the Sankey Diagram in no time without coding only on few clicks. Read more here : https://ppcexpo.com/blog/visualizing-customer-journey-with-sankey-diagram .

Zaid Akhtar said...

Thanks for the informative article. This is one of the best resources I have found in quite some time. Nicely written and great info. I really cannot thank you enough for sharing.
English Learning App In India | English Learning App

Petersons said...

Can you please provide more information on this subject? BTW your blog is great. Cheers.


stratford management scam

James said...

I like this post, And I figure that they have a great time to peruse this post, they might take a decent site to make an information, thanks for sharing it with me. locksmith in Markham

Machine Learning Course in Bangalore said...

You actually make it seem like it's really easy with your acting, but I think it's something I think I would never understand. I find that too complicated and extremely broad. I look forward to your next message. I'll try to figure it out!

Machine Learning Course in Bangalore

Data Science Training in Bangalore said...

I bookmarked your website because this site contains valuable information. I am very satisfied with the quality and the presentation of the articles. Thank you so much for saving great things. I am very grateful for this site.

Data Science Training in Bangalore

Digital Marketing Training in Bangalore said...

Wonderful blog found to be very impressive to come across such an awesome blog. I should really appreciate the blogger for the efforts they have put in to develop such amazing content for all the curious readers who are very keen on being updated across every corner. Ultimately, this is an awesome experience for the readers. Anyways, thanks a lot and keep sharing the content in the future too.

Digital Marketing Training in Bangalore

Artificial Intelligence Training in Bangalore said...

I wanted to leave a little comment to support you and wish you the best of luck. We wish you the best of luck in all of your blogging endeavors.

Artificial Intelligence Training in Bangalore

Petersons said...

Very informative site, i must bookmark it, keep posting interesting articles...


transponder key programming

vishyattechnologies said...

Vishyat Technologies is one of the best Digital Marketing and SEO company in Chandigarh. Our expert SEO services in Chandigarhhave helped a lot of business get better online exposure. SEO services Company in Amritsar,
Seo Company In Punjab, SEO company in India, SEO COMPANY IN GURGAON

Vishyat Technologies offers Website development, SEO, PPC, Backlink Building, Content Development, Content Marketing, Conversion Rate Optimization, Email Marketing, Online Reputation Management, SEO Company in Faridabad, SEO Company in Noida, Brand Reputation Management, Hospital Reputation Management, Web Analytics and Internet Marketing. Vishyat Technologies optimizes your site, withor set up an extensive social media presence for you. We offer great quality content for your website and effective social media marketing campaigns. We also offer SEO Reseller services or SEO Outsourcing services to our clients in US, UK, Australia, Canada and Middle-East. You can check how’s your keyword ranking using a Rank checker tool on our website.
Website: http://www.vishyat.com
Email: contact(at)vishyat.com
Contact: +91-935-461-6193, +917827890148
VISHYAT PRESENCE
SEO COMPANY IN GURGAON
SEO COMPANY IN PUNJAB
SEO COMPANY IN CHANDIGARH, SEO COMPANY IN INDIA

ITSolution4Us Cloud Training India said...

ITSolution4Us is a platform where curious and eager professionals/graduates can upskill. We do so by connecting you with Certified experts through online cloud training in various technologies. We provide a perfect amalgamation of theoretical knowledge and practical experience to help you take that plunge in various technologies, right from the get-go.
We offer VBCS Training and Oracle OIC training. You can also learn Microsoft Azure training, Mule soft training, Salesforce training, Amazon AWS Training etc.
IT Solution 4 us is a platform where curious and eager professionals/graduates can upskill. We do so by connecting you with certified experts through online training in various technologies.

Business Analytics Course said...

It's like you understand the topic well, but forgot to include your readers. Maybe you should think about it from several angles.
Business Analytics Course

Best Data Science Courses said...

Really impressed! Everything is a very open and very clear clarification of the issues. It contains true facts. Your website is very valuable. Thanks for sharing.
Best Data Science Courses in Bangalore

Data Analytics Course said...

Really impressed! Everything is a very open and very clear clarification of the issues. It contains true facts. Your website is very valuable. Thanks for sharing.
Data Analytics Course in Bangalore

Digital Marketing Course said...

I am more curious to take an interest in some of them. I hope you will provide more information on these topics in your next articles.

Digital Marketing Course in Bangalore

opbest said...

Took me time to read all the comments, but I really enjoyed the article. It proved to be Very helpful to me and I am sure to all the
commenters here! It’s always nice when you can not only be informed, but also entertained!

visit my blog:: 휴게텔

(freaky)

skvisiontec said...

You can also find our quickbooks help desk phone number for further details about how to contact our QuickBooks customer support team.

Artificial Intelligence Training in Bangalore said...

I found Habit to be a transparent site, a social hub that is a conglomerate of buyers and sellers willing to offer digital advice online at a decent cost.

Artificial Intelligence Training in Bangalore

Machine Learning Course in Bangalore said...

Truly incredible blog found to be very impressive due to which the learners who go through it will try to explore themselves with the content to develop the skills to an extreme level. Eventually, thanking the blogger to come up with such phenomenal content. Hope you arrive with similar content in the future as well.

Machine Learning Course in Bangalore

Tech Institute said...

Excellent Blog! I would like to thank you for the efforts you have made in writing this post. Gained lots of knowledge.
Data Analytics Course

Data Science Courses said...

Awesome article. I enjoyed reading your articles. this can be really a good scan for me. wanting forward to reading new articles. maintain the nice work!
Data Science Courses in Bangalore

AI Courses said...

What an incredible message this is. Truly one of the best posts I have ever seen in my life. Wow, keep it up.
AI Courses in Bangalore

VISHYAT TECHNOLOGIES SEO INDIA said...

Vishyat Technologies is one of the best Digital Marketing and SEO company in Chandigarh. Our expert SEO services in Chandigarhhave helped a lot of business get better online exposure. SEO services Company in Amritsar,
Seo Company In Punjab, SEO company in India, SEO COMPANY IN GURGAON

Vishyat Technologies offers Website development, SEO, PPC, Backlink Building, Content Development, Content Marketing, Conversion Rate Optimization, Email Marketing, Online Reputation Management, SEO Company in Faridabad, SEO Company in Noida, Brand Reputation Management, Hospital Reputation Management, Web Analytics and Internet Marketing. Vishyat Technologies optimizes your site, withor set up an extensive social media presence for you. We offer great quality content for your website and effective social media marketing campaigns. We also offer SEO Reseller services or SEO Outsourcing services to our clients in US, UK, Australia, Canada and Middle-East. You can check how’s your keyword ranking using a Rank checker tool on our website.
VISHYAT PRESENCE
Our digital Marketing services and SEO services in Chandigarh enable us to take evidence based
strategic decisions. Getting website ranked on the first page of the SERP is the aim of every website
owner. However, this is a complex process as it involves the large numbers seo training in chandigarhof factors that need to be taken care of. So, what do we do? We focus on the core guidelines laid down by Google Webmasters like to have a unique content, schema.org validated code, positive link profile, etc.

vikram said...

informative article

software agency

ICFAD SKIN SPECIALIST DERABASSI said...

The Cosmetic Health Clinic provides a range of non-invasive cosmetic treatments designed to improve your skin & hair and restore its natural beauty. We have the best doctors for skin treatment in Derabassi or skin specialist in Derabassi. We also offer hairfall treatment in Derabassi. The transparency in the services that we offer and the honesty towards our work has made us one of the Facial aesthetics & Hair Transplant Clinic.

Fortune Education Group said...

thanks for this great post keep it up Danylo Halytsky Lviv National Medical University

360DigiTMGAurangabad said...

Amazing blog.Thanks for sharing such excellent information with us. keep sharing...
data scientist training in aurangabad

Kapil Sandeep CA Mohali Chandigarh said...

Kapil Sandeep & Associates came into existence in 1999. We are counted among the best CA in Mohali and top CA firms in Chandigarh. a team of four experienced and professional partners who strive to offer bespoke accounting, assurance, taxation, gst registration in Mohali Chandigarh, income tax return filing in mohali chandigarh and consultancy services. We take pride in having closely worked with numerous contractors and business owners for more than 21 years.
You can contact us for company registration in mohali chandigarh. We understand our clients' needs and provide relevant services to them. Experience and innovative business solutions help us deliver best for our clients.

360DigiTMGAurangabad said...

This post is very simple to read and appreciate without leaving any details out. Great work!
data scientist training in aurangabad

software development agency said...

amazing post thanks for the sharing beautiful post
everyone looking software agency
brisk logic is a software design app development and web design agency is located in Mohali India
mobile app development

Kashi Digital Agency said...

Appreciate to peruse marvelous substance from this site. I bookmarked this site.


Digital Marketing Company In India
SEO Company In Varanasi | SEO Services In Varanasi
Website Design Company In Varanasi
Cheap Website Design Company In Bangalore
Website Designer, maker, creator, developer Near me
Best Software Company In India
Varanasi CAB | Taxi, Cab Service In Varanasi | Airport Cab | Car Rentals in Varanasi
Ratanmatka | Satta Matka | Kalyan Matka | Matka Result | Matka
Health And Beauty Products Manufacturer

Kashi Digital Agency said...

Seo services in Varanasi : Best SEO Companies in Varanasi: Hire Digital Marketing Agency, best SEO Agency in Varanasi who Can Boost Your SEO Ranking, guaranteed SEO Services; SEO Company In Varanasi.

Digital Marketing Company In India : Kashi Digital Agency is one of the Best Digital Marketing companies in Varanasi, India . Ranked among the Top digital marketing agencies in India. SEO Company In India.

Cheap Website Design Company In Bangalore : Best Website Design Company in Bangalore : Kashi Digital Agency is one of the Best Social Media Marketing agency in Bangalore which provides you the right services.

E-commerce Website design company India : e-commerce Company in India : Kashi Digital Agency is one of the best e-commerce development services provider in Varanasi, India. This one of the best service if you want quick ROI.

Tutorials said...


Very informative and helpful. Thank You for sharing the blog.
JMeter training in chennai | JMeter course online

Tech Institute said...

I am really enjoying reading your well written articles. I am looking forward to reading new articles. Keep up the good work.
Data Science Courses in Bangalore

Raghav said...

It's like you understand the topic well, but forgot to include your readers. Maybe you should think about it from several angles.
Data Science Course in Delhi

kumal kumar said...

Very good message. I stumbled across your blog and wanted to say that I really enjoyed reading your articles.
AI Courses in Bangalore

Dev Kumar said...

I am sure it will help many people. Keep up the good work. It's very compelling and I enjoyed browsing the entire blog.
Business Analytics Course in Bangalore

Karan said...

It's like you understand the topic well, but forgot to include your readers. Maybe you should think about it from several angles.
Business Analytics Course in Delhi

Bhuvankumar said...

I feel very grateful that I read this. It is very helpful and very informative and I really learned a lot from it.
Data Analytics Course

Fortune Education Group said...

thanks for this article Why Study MBBS at V.N.Karazin KNU?

Data Science Chennai said...

This is additionally a generally excellent post which I truly delighted in perusing. It isn't each day that I have the likelihood to see something like this.. data science course in chennai

Rohan Singh said...

We always appreciate such excellent articles want to make sure about the latest ideas that count on your success. So, get in touch with us at AppSquadz and lead the world. Also visit: iPhone app development company

Mahesh said...

Hi, I looked at most of your posts, This article is probably where I got the most useful information for my research. Thanks for posting, we can find out more about this. Do you know of any other websites on this topic?
Artificial Intelligence Course in Delhi

Get It SMS said...

My brother recommended, I might like this web site. He was totally right. This put up actually made my day. You can not believe just how much time I had spent for this information! Thank you for sharing I believe a lot of people will be surprised to read this article. This article provides light by which we can notice the reality. This really is very nice one and allows advanced information. Get It SMS is a India No 1 bulk SMS Service provider. We are giving special offer in bulk SMS service. Our Services are Voice SMS, promotional bulk SMS, transactional SMS, miss call service, bulk e-mailing, transactional bulk SMS, Missed call alert Whatsapp SMS and website Design. Sign Up for a free trial!
Whatsapp Bulk SMS Service Provider Bangalore
Bulk SMS Service Provider in Bangalore
Bulk SMS Service Provider in Bangalore
Email Marketing Services in Bangalore, Gurugram, Jaipur, India

Tutorials said...

Valuable Information. It's very useful for me. Thank You

AWS training in chennai | AWS course in Chennai

vishyat technologies said...

Vishyat Technologies is one of the best Digital Marketing and SEO company in Chandigarh. Our expert SEO services in Chandigarh have helped a lot of business get better online exposure. SEO services Company in Amritsar,
Seo Company In Punjab, SEO company in India, SEO COMPANY IN GURGAON

Vishyat Technologies offers Website development, SEO, PPC, Backlink Building, Content Development, Content Marketing, Conversion Rate Optimization, Email Marketing, Online Reputation Management, SEO Company in Faridabad, SEO Company in Noida, Brand Reputation Management, Hospital Reputation Management, Web Analytics and Internet Marketing.

Website Designing Company said...

bluetooth earbuds

Educational Courses in Bangalore said...

Very good message. I came across your blog and wanted to tell you that I really enjoyed reading your articles.

Business Analytics Course

Prajwal said...

Really impressed! Everything is a very open and very clear clarification of the issues. It contains true facts. Your website is very valuable. Thanks for sharing.
MLOps Course

BK-25 said...

Good blog thank you for sharing.

Robotic Process Automation Training in Chennai
PHP Training in Chennai
DevOps Training in Chennai
Cloud-Computing Training in Chennai
Best Software training institute
blueprism training in Chennai
Ui-Path Training in Chennai
Azure Training in Chennai

Kashi Digital Agency said...

Digital Marketing Company In India
SEO Company In Varanasi | SEO Services In Varanasi
Website Design Company In Varanasi
Cheap Website Design Company In Bangalore
Website Designer, maker, creator, developer Near me
Best Software Company In India
Varanasi CAB | Taxi, Cab Service In Varanasi | Airport Cab | Car Rentals in Varanasi
Health And Beauty Products Manufacturer

Educational Training Bangalore said...

It's like you've got the point right, but forgot to include your readers. Maybe you should think about it from different angles.

Data Analytics Course in Bangalore

Professional Training in Bangalore said...

It's like you've got the point right, but forgot to include your readers. Maybe you should think about it from different angles.


Digital Marketing Course in Bangalore

Professional Courses in Bangalore said...

It's like you've got the point right, but forgot to include your readers. Maybe you should think about it from different angles.


Best Data Science Courses in Bangalore

Educational Courses in Bangalore said...

You have completed certain reliable points there. I did some research on the subject and found that almost everyone will agree with your blog.


Business Analytics Course

Educational Training Bangalore said...

Very good message. I came across your blog and wanted to tell you that I really enjoyed reading your articles.


Data Analytics Course in Bangalore

Professional Training in Bangalore said...

I am a new user of this site, so here I saw several articles and posts published on this site, I am more interested in some of them, will provide more information on these topics in future articles.

Digital Marketing Course in Bangalore

Sushil said...

It's like you understand the topic well, but forgot to include your readers. Maybe you should think about it from several angles.
IOT Course

Machine Learning Course in BLR said...

I am more curious to take an interest in some of them. I hope you will provide more information on these topics in your next articles.

Machine Learning Course in Bangalore

Artificial Intelligence Training in BLR said...

You have completed certain reliable points there. I did some research on the subject and found that almost everyone will agree with your blog.

Artificial Intelligence Training in Bangalore

Professional Courses in Bangalore said...

Very good message. I came across your blog and wanted to tell you that I really enjoyed reading your articles.

Best Data Science Courses in Bangalore

Educational Training Bangalore said...

I am a new user of this site, so here I saw several articles and posts published on this site, I am more interested in some of them, will provide more information on these topics in future articles.


Data Analytics Course in Bangalore

Professional Training in Bangalore said...

Very good message. I came across your blog and wanted to tell you that I really enjoyed reading your articles.

Digital Marketing Course in Bangalore

Data Science Training in BLR said...

I wanted to leave a little comment to support you and wish you the best of luck. We wish you the best of luck in all of your blogging endeavors.

Data Science Training in Bangalore

Digital Marketing Training in BLR said...

It is late to find this act. At least one should be familiar with the fact that such events exist. I agree with your blog and will come back to inspect it further in the future, so keep your performance going.

Digital Marketing Training in Bangalore

Tamil novels said...

Thank you for sharing this valuable information with us.
Tamil romantic novels pdf
Ramanichandran novels PDF
srikala novels PDF
Mallika manivannan novels PDF
muthulakshmi raghavan novels PDF
Infaa Alocious Novels PDF
N Seethalakshmi Novels PDF
Sashi Murali Tamil Novels PDF

Professional Courses in Bangalore said...

You have completed certain reliable points there. I did some research on the subject and found that almost everyone will agree with your blog.

Best Data Science Courses in Bangalore

Varun said...

Actually I read it yesterday but I had some ideas about it and today I wanted to read it again because it is so well written.
IoT Course

Prajwal said...

Very good message, I stumbled across your blog and wanted to say that I really enjoyed reading your articles. Anyway, I will subscribe to your feed and hope you post again soon.
MLOps Course

Raghav said...

Hi, I looked at most of your posts. This article is probably where I got the most useful information for my research. Thanks for posting, we can find out more about this. Do you know of any other websites on this topic?
IoT Training

Data Science Training in BLR said...

A good blog always contains new and exciting information and as I read it I felt that this blog really has all of these qualities that make a blog.

Data Science Training in Bangalore

Technical Knowledge said...

Nice Post thank you very much for sharing such a useful information and will definitely saved and revisit your site and i have bookmarked to check out new things frm your post.
Data Science Course

Machine Learning Course in BLR said...

Happy to chat on your blog, I feel like I can't wait to read more reliable posts and think we all want to thank many blog posts to share with us.

Machine Learning Course in Bangalore

EDU said...

Thanks Your post is so cool and this is an extraordinary moving article and If it's not too much trouble share more like that.
Digital Marketing Course in Hyderabad

Courses said...

You have done excellent job Thanks a lot and I enjoyed your blog. Great Post.
Data Science Certification in Hyderabad

BK-25 said...

Awesome blog thank you for sharing.

DevOps Certification in Chennai
php course in chenna
Software training institute in chennai
blue prism course in chennai
best rpa training in chennai
rpa uipath training in chennai
cloud computing courses in chennai
azure certification in chennai

Training said...

Great post happy to see this. I thought this was a pretty interesting read when it comes to this topic Information. Thanks..
Artificial Intelligence Course

Varun said...

Hi, I looked at most of your posts. This article is probably where I got the most useful information for my research. Thanks for posting, we can find out more about this. Do you know of any other websites on this topic?
IoT Course

Varun said...

I was browsing the internet for information and found your blog. I am impressed with the information you have on this blog.
MLOps Course

Sushil said...

Very good message. I stumbled across your blog and wanted to say that I really enjoyed reading your articles. Anyway, I will subscribe to your feed and hope you post again soon.
MLOps Training

Petersons said...

Our goal is to make buying or selling a home, or getting a mortgage, as easy and stress-free as possible. Our Artificial Intelligence-Digitized platform is designed to educate & empower the consumer and connect you with top-rated certified agents, while saving thousands of dollars through the process.

buy realty

Raghav said...

Actually I read it yesterday but I had some ideas about it and today I wanted to read it again because it is so well written.
IoT Training

Varun said...

It's good to visit your blog again, it's been months for me. Well, this article that I have been waiting for so long. I will need this post to complete my college homework, and it has the exact same topic with your article. Thanks, have a good day.
IoT Training

Digital Vishnu said...

Thanks for sharing a great article. The Article which you have shared is very informative..

Digital Marketing Courses in Coimbatore
Digital Marketing Courses in Trichy
Digital Marketing Courses in Madurai

Educational Courses in Bangalore said...

I am a new user of this site, so here I saw several articles and posts published on this site, I am more interested in some of them, will provide more information on these topics in future articles.

Business Analytics Course

Professional Courses in Bangalore said...

You have completed certain reliable points there. I did some research on the subject and found that almost everyone will agree with your blog.

Data Analytics Course in Bangalore

Tech Institute said...

A good blog always contains new and exciting information and as I read it I felt that this blog really has all of these qualities that make a blog.
Data Science Institutes in Bangalore

Christy said...

Your article gives a good experience to us. Thanks for Sharing this content.
IOS app development company in chennai
Mobile app development company in chennai
Best Digital marketing company in chennai

Tech Courses said...

I was browsing the internet for information and found your blog. I am impressed with the information you have on this blog.
Business Analytics Course in Jaipur

amirosta said...

در صورت نیاز به خدمات ساخت لوگو و آرم می توانید به آژانس ریوال آنلاین مراجعه کنید.

Aditya said...

It is late to find this act. At least one should be familiar with the fact that such events exist. I agree with your blog and will come back to inspect it further in the future, so keep your performance going.
Cyber Security Course in Jaipur

Aditya said...

Very good message. I stumbled across your blog and wanted to say that I really enjoyed reading your articles. Anyway, I will subscribe to your feed and hope you post again soon.
Machine Learning Training in Jaipur

Dev Kumar said...

We are really grateful for your blog post. You will find a lot of approaches after visiting your post. Great work thank you.
Cloud Computing Training in Bangalore

tech science said...



It is late to find this act. At least one should be familiar with the fact that such events exist. I agree with your blog and will come back to inspect it further in the future, so keep your performance going.machine learning course in jaipur

Professional Course said...

I am more curious to take an interest in some of them. I hope you will provide more information on these topics in your next articles.

Data Science Training Institutes in Bangalore

tech science said...


Hi, I looked at most of your posts. This article is probably where I got the most useful information for my research. Thanks for posting, we can find out more about this. Do you know of any other websites on this topic?ethical hacking training in jaipur

Dev Kumar said...

Excellent effort to make this blog more wonderful and informative. The information shared was very useful.
Cloud Computing Course Fees in Bangalore

tech science said...



Now is the perfect time to plan for the future and now is the time to be happy. I have read this article and if I can I want to suggest some interesting things or suggestions to you. Perhaps you could write future articles that reference this article. I want to know more!iot course in nagpur

Credo Systemz said...

very interesting and informative article. Python Training in Chennai

Aditya said...

I was browsing the internet for information and found your blog. I am impressed with the information you have on this blog.
Cyber Security Course in Jaipur

Dev Kumar said...

I am sure it will help many people. Keep up the good work. It's very compelling and I enjoyed browsing the entire blog.
Business Analytics Course in Bangalore

Bhuvankumar said...

It is a very helpful and very informative blog. I really learned a lot from it thanks for sharing.
Data Analytics Course

«Oldest ‹Older   801 – 947 of 947   Newer› Newest»